Showing preview only (2,331K chars total). Download the full file or copy to clipboard to get everything.
Repository: django-silk/silk
Branch: master
Commit: dd9328662f88
Files: 221
Total size: 2.2 MB
Directory structure:
gitextract_azh7ec58/
├── .coveragerc
├── .github/
│ └── workflows/
│ ├── release.yml
│ └── test.yml
├── .gitignore
├── .pre-commit-config.yaml
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── MANIFEST.in
├── README.md
├── docs/
│ ├── Makefile
│ ├── conf.py
│ ├── configuration.rst
│ ├── index.rst
│ ├── profiling.rst
│ ├── quickstart.rst
│ └── troubleshooting.rst
├── gulpfile.js
├── package.json
├── project/
│ ├── example_app/
│ │ ├── __init__.py
│ │ ├── admin.py
│ │ ├── migrations/
│ │ │ ├── 0001_initial.py
│ │ │ ├── 0002_alter_blind_photo.py
│ │ │ ├── 0003_blind_unique_name_if_provided.py
│ │ │ └── __init__.py
│ │ ├── models.py
│ │ ├── templates/
│ │ │ └── example_app/
│ │ │ ├── blind_form.html
│ │ │ ├── index.html
│ │ │ └── login.html
│ │ ├── tests.py
│ │ ├── urls.py
│ │ └── views.py
│ ├── manage.py
│ ├── project/
│ │ ├── __init__.py
│ │ ├── settings.py
│ │ └── urls.py
│ ├── tests/
│ │ ├── __init__.py
│ │ ├── data/
│ │ │ ├── __init__.py
│ │ │ └── dynamic.py
│ │ ├── factories.py
│ │ ├── test_app_config.py
│ │ ├── test_code.py
│ │ ├── test_code_gen_curl.py
│ │ ├── test_code_gen_django.py
│ │ ├── test_collector.py
│ │ ├── test_command_garbage_collect.py
│ │ ├── test_compat.py
│ │ ├── test_config_auth.py
│ │ ├── test_config_long_urls.py
│ │ ├── test_config_max_body_size.py
│ │ ├── test_config_meta.py
│ │ ├── test_db.py
│ │ ├── test_dynamic_profiling.py
│ │ ├── test_encoding.py
│ │ ├── test_end_points.py
│ │ ├── test_execute_sql.py
│ │ ├── test_filters.py
│ │ ├── test_lib/
│ │ │ ├── __init__.py
│ │ │ ├── assertion.py
│ │ │ └── mock_suite.py
│ │ ├── test_models.py
│ │ ├── test_multipart_forms.py
│ │ ├── test_profile_dot.py
│ │ ├── test_profile_parser.py
│ │ ├── test_response_assumptions.py
│ │ ├── test_sensitive_data_in_request.py
│ │ ├── test_silky_middleware.py
│ │ ├── test_silky_profiler.py
│ │ ├── test_view_clear_db.py
│ │ ├── test_view_profiling.py
│ │ ├── test_view_requests.py
│ │ ├── test_view_sql_detail.py
│ │ ├── test_view_summary_view.py
│ │ ├── urlconf_without_silk.py
│ │ └── util.py
│ └── wsgi.py
├── pyproject.toml
├── pytest.ini
├── requirements.txt
├── scss/
│ ├── components/
│ │ ├── cell.scss
│ │ ├── colors.scss
│ │ ├── fonts.scss
│ │ ├── heading.scss
│ │ ├── numeric.scss
│ │ ├── row.scss
│ │ └── summary.scss
│ └── pages/
│ ├── base.scss
│ ├── clear_db.scss
│ ├── cprofile.scss
│ ├── detail_base.scss
│ ├── profile_detail.scss
│ ├── profiling.scss
│ ├── raw.scss
│ ├── request.scss
│ ├── requests.scss
│ ├── root_base.scss
│ ├── sql.scss
│ ├── sql_detail.scss
│ └── summary.scss
├── setup.py
├── silk/
│ ├── __init__.py
│ ├── apps.py
│ ├── auth.py
│ ├── code_generation/
│ │ ├── __init__.py
│ │ ├── curl.py
│ │ └── django_test_client.py
│ ├── collector.py
│ ├── config.py
│ ├── errors.py
│ ├── management/
│ │ ├── __init__.py
│ │ └── commands/
│ │ ├── __init__.py
│ │ ├── silk_clear_request_log.py
│ │ └── silk_request_garbage_collect.py
│ ├── middleware.py
│ ├── migrations/
│ │ ├── 0001_initial.py
│ │ ├── 0002_auto_update_uuid4_id_field.py
│ │ ├── 0003_request_prof_file.py
│ │ ├── 0004_request_prof_file_storage.py
│ │ ├── 0005_increase_request_prof_file_length.py
│ │ ├── 0006_fix_request_prof_file_blank.py
│ │ ├── 0007_sqlquery_identifier.py
│ │ ├── 0008_sqlquery_analysis.py
│ │ └── __init__.py
│ ├── model_factory.py
│ ├── models.py
│ ├── profiling/
│ │ ├── __init__.py
│ │ ├── dynamic.py
│ │ └── profiler.py
│ ├── request_filters.py
│ ├── singleton.py
│ ├── sql.py
│ ├── static/
│ │ └── silk/
│ │ ├── css/
│ │ │ ├── components/
│ │ │ │ ├── cell.css
│ │ │ │ ├── colors.css
│ │ │ │ ├── fonts.css
│ │ │ │ ├── heading.css
│ │ │ │ ├── numeric.css
│ │ │ │ ├── row.css
│ │ │ │ └── summary.css
│ │ │ └── pages/
│ │ │ ├── base.css
│ │ │ ├── clear_db.css
│ │ │ ├── cprofile.css
│ │ │ ├── detail_base.css
│ │ │ ├── profile_detail.css
│ │ │ ├── profiling.css
│ │ │ ├── raw.css
│ │ │ ├── request.css
│ │ │ ├── requests.css
│ │ │ ├── root_base.css
│ │ │ ├── sql.css
│ │ │ ├── sql_detail.css
│ │ │ └── summary.css
│ │ ├── js/
│ │ │ ├── components/
│ │ │ │ ├── cell.js
│ │ │ │ └── filters.js
│ │ │ └── pages/
│ │ │ ├── base.js
│ │ │ ├── clear_db.js
│ │ │ ├── detail_base.js
│ │ │ ├── profile_detail.js
│ │ │ ├── profiling.js
│ │ │ ├── raw.js
│ │ │ ├── request.js
│ │ │ ├── requests.js
│ │ │ ├── root_base.js
│ │ │ ├── sql.js
│ │ │ ├── sql_detail.js
│ │ │ └── summary.js
│ │ └── lib/
│ │ ├── highlight/
│ │ │ ├── foundation.css
│ │ │ └── highlight.pack.js
│ │ ├── jquery.datetimepicker.css
│ │ ├── jquery.datetimepicker.js
│ │ ├── sortable.js
│ │ └── viz-lite.js
│ ├── storage.py
│ ├── templates/
│ │ └── silk/
│ │ ├── base/
│ │ │ ├── base.html
│ │ │ ├── detail_base.html
│ │ │ └── root_base.html
│ │ ├── clear_db.html
│ │ ├── cprofile.html
│ │ ├── inclusion/
│ │ │ ├── code.html
│ │ │ ├── heading.html
│ │ │ ├── profile_menu.html
│ │ │ ├── profile_summary.html
│ │ │ ├── request_menu.html
│ │ │ ├── request_summary.html
│ │ │ ├── request_summary_row.html
│ │ │ └── root_menu.html
│ │ ├── profile_detail.html
│ │ ├── profiling.html
│ │ ├── raw.html
│ │ ├── request.html
│ │ ├── requests.html
│ │ ├── sql.html
│ │ ├── sql_detail.html
│ │ └── summary.html
│ ├── templatetags/
│ │ ├── __init__.py
│ │ ├── silk_filters.py
│ │ ├── silk_inclusion.py
│ │ ├── silk_nav.py
│ │ └── silk_urls.py
│ ├── urls.py
│ ├── utils/
│ │ ├── __init__.py
│ │ ├── data_deletion.py
│ │ ├── pagination.py
│ │ └── profile_parser.py
│ └── views/
│ ├── __init__.py
│ ├── clear_db.py
│ ├── code.py
│ ├── cprofile.py
│ ├── profile_detail.py
│ ├── profile_dot.py
│ ├── profile_download.py
│ ├── profiling.py
│ ├── raw.py
│ ├── request_detail.py
│ ├── requests.py
│ ├── sql.py
│ ├── sql_detail.py
│ └── summary.py
├── silk.sublime-project
├── tox.ini
└── web.psd
================================================
FILE CONTENTS
================================================
================================================
FILE: .coveragerc
================================================
[run]
branch = True
source = silk
================================================
FILE: .github/workflows/release.yml
================================================
name: Release
on:
push:
tags:
- '*'
jobs:
build:
if: github.repository == 'jazzband/django-silk'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: 3.14
- name: Install dependencies
run: |
python -m pip install -U pip
python -m pip install -U setuptools twine wheel
- name: Build package
run: |
python setup.py --version
python setup.py sdist --format=gztar bdist_wheel
twine check dist/*
- name: Upload packages to Jazzband
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
uses: pypa/gh-action-pypi-publish@master
with:
user: jazzband
password: ${{ secrets.JAZZBAND_RELEASE_KEY }}
repository_url: https://jazzband.co/projects/django-silk/upload
================================================
FILE: .github/workflows/test.yml
================================================
name: Test
on: [push, pull_request]
jobs:
build:
name: build (Python ${{ matrix.python-version }}, Django ${{ matrix.django-version }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ['3.10', '3.11', '3.12', '3.13', '3.14']
django-version: ['4.2', '5.1', '5.2', '6.0', 'main']
postgres-version: ['14', '18']
mariadb-version: ['10.6', '10.11', '11.4', '11.8']
exclude:
# Django 4.2 doesn't support Python >= 3.13
- django-version: '4.2'
python-version: '3.13'
- django-version: '4.2'
python-version: '3.14'
# Django 5.1 doesn't support Python >= 3.14
- django-version: '5.1'
python-version: '3.14'
# Django 6.0 doesn't support Python <3.12 (https://docs.djangoproject.com/en/dev/releases/6.0/#python-compatibility)
- django-version: '6.0'
python-version: '3.10'
- django-version: '6.0'
python-version: '3.11'
- django-version: 'main'
python-version: '3.10'
- django-version: 'main'
python-version: '3.11'
services:
postgres:
image: postgres:${{ matrix.postgres-version }}
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
mariadb:
image: mariadb:${{ matrix.mariadb-version }}
env:
MYSQL_ROOT_PASSWORD: mysql
MYSQL_DATABASE: mysql
options: >-
--health-cmd "mariadb-admin ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 3306:3306
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Get pip cache dir
id: pip-cache
run: |
echo "dir=$(pip cache dir)" >> $GITHUB_OUTPUT
- name: Cache
uses: actions/cache@v4
with:
path: ${{ steps.pip-cache.outputs.dir }}
key:
${{ matrix.python-version }}-v1-${{ hashFiles('**/requirements.txt') }}-${{ hashFiles('**/setup.py') }}-${{ hashFiles('**/tox.ini') }}
restore-keys: |
${{ matrix.python-version }}-v1-
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install --upgrade tox tox-gh-actions
- name: Tox tests
run: |
tox -v
env:
DJANGO: ${{ matrix.django-version }}
- name: Upload coverage
uses: codecov/codecov-action@v3
with:
name: Python ${{ matrix.python-version }}
================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
# C extensions
*.so
# Distribution / packaging
.Python
env/
bin/
build/
develop-eggs/
dist/
eggs/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
.eggs
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.pytest_cache/
.coverage
.cache
nosetests.xml
coverage.xml
# Translations
*.mo
# Mr Developer
.mr.developer.cfg
.project
.pydevproject
# Rope
.ropeproject
# Django stuff:
*.log
*.pot
# Sphinx documentation
docs/_build/
# Other
dist
.idea
*db.sqlite*
/django_silky/media
*.prof
project/media/
project/tmp/
.vscode/
# Hardlinks
/django_silky/silk
# Pip
/src
# Sphinx
_html
# Tox
.tox.ini.swp
# Node
node_modules
# Gulp
.gulp-scss-cache
.sass-cache
*~
.DS_Store
### PyCharm ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
*.iml
## Directory-based project format:
.idea/
## File-based project format:
*.ipr
*.iws
## Plugin-specific files:
# IntelliJ
/out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Virtual env
.venv*
package-lock.json
*.db
================================================
FILE: .pre-commit-config.yaml
================================================
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: 'v6.0.0'
hooks:
- id: check-merge-conflict
- repo: https://github.com/hadialqattan/pycln
rev: v2.6.0
hooks:
- id: pycln
args: ['--all']
- repo: https://github.com/asottile/yesqa
rev: v1.5.0
hooks:
- id: yesqa
- repo: https://github.com/pycqa/isort
rev: '8.0.1'
hooks:
- id: isort
args: ['--profile', 'black']
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: 'v6.0.0'
hooks:
- id: end-of-file-fixer
exclude: >-
^docs/[^/]*\.svg$
- id: requirements-txt-fixer
- id: trailing-whitespace
types: [python]
- id: file-contents-sorter
files: |
CONTRIBUTORS.txt|
docs/spelling_wordlist.txt|
.gitignore|
.gitattributes
- id: check-case-conflict
- id: check-json
- id: check-xml
- id: check-toml
- id: check-xml
- id: check-yaml
- id: debug-statements
- id: check-added-large-files
- id: check-symlinks
- id: debug-statements
- id: detect-aws-credentials
args: ['--allow-missing-credentials']
- id: detect-private-key
exclude: ^examples|(?:tests/ssl)/
- repo: https://github.com/asottile/pyupgrade
rev: 'v3.21.2'
hooks:
- id: pyupgrade
args: ['--keep-mock']
- repo: https://github.com/adamchainz/django-upgrade
rev: '1.30.0'
hooks:
- id: django-upgrade
args: [--target-version, '4.2']
- repo: https://github.com/hhatto/autopep8
rev: 'v2.3.2'
hooks:
- id: autopep8
- repo: https://github.com/PyCQA/flake8
rev: '7.3.0'
hooks:
- id: flake8
exclude: '^docs/'
- repo: https://github.com/Lucas-C/pre-commit-hooks-markup
rev: v1.0.1
hooks:
- id: rst-linter
files: >-
^[^/]+[.]rst$
================================================
FILE: CHANGELOG.md
================================================
# Change Log
## Unreleased
## [5.5.0](https://github.com/jazzband/django-silk/tree/5.5.0) (2026-03-06)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/5.4.3..5.5.0)
**Fixes:**
- Fix context manager for `_process_response` (#827) @izabala033
- Fix mouse event for sql navigation (#847) @albertyw
**Features/Enhancements:**
- Add support for Django 6.0 (#836) @albertyw
- Add support for Python 3.14 (#834) @albertyw
- Get paginator limit from URL params (#646) @strig
- Hide pagination when there's only one page (#844) @ShlomoCode
**Maintenance and Cleanup:**
- Remove official support for Python 3.9 (#834) @albertyw
- Dependency updates
## [5.4.3](https://github.com/jazzband/django-silk/tree/5.4.3) (2025-09-08)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/5.4.2..5.4.3)
**Fixes:**
- Fix double EXPLAIN when calling explain on queryset (#654) @stereodamage
- Fix serialization issues for binary and json fields (#821) @albertyw
## [5.4.2](https://github.com/jazzband/django-silk/tree/5.4.2) (2025-08-17)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/5.4.1..5.4.2)
**Fixes:**
- Reverts #798 which causes issues when serializing JSONFields (#807) @albertyw
- Also reverts #798 which has a race condition when modifying `execute_sql` (#816) @albertyw
- Catch and ignore sql encoding errors (#810) @albertyw @bpascard
**Maintenance and Cleanup:**
- Document that context_processors.request is required (#815) @albertyw
- Fix documentation formatting (#810) @albertyw
- Test refactors (#814) @albertyw
## [5.4.1](https://github.com/jazzband/django-silk/tree/5.4.1) (2025-08-10)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/5.4.0..5.4.1)
**Fixes:**
- Fixes curl/client values rendering in request_detail (#797) @bcmyguest
- Fix serialization of non-unicode binary data, add cleanup in middleware (#798) @glennmatthews
- Make transactions target the DB alias selected by the router (#801) @OscarVanL
**Maintenance and Cleanup:**
- Dependency updates
- Documentation updates
## [5.4.0](https://github.com/jazzband/django-silk/tree/5.4.0) (2025-05-03)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/5.3.2..5.4.0)
**Note: this release removes support for Django 5.0**
**Note: this release removes autoformatting of python snippets; continue formatting by pip installing `django-silk[formatting]`**
**Features/Enhancements:**
- Add support for Django 5.2 (#784) @albertyw
- Support opening SQL details in a new window (#788) @joaopedroalbq
- Avoid timeouts when deserializing large jsons (#768) @quertenmont
- Make autopep8 optional (#782) @albertyw
**Fixes:**
- Fix masking sensitive data when an empty `SILKY_SENSITIVE_KEYS` is provided (#777) @ahsanshafiq742
**Maintenance and Cleanup:**
- Remove support for Django 5.0 (#783) @albertyw
- Fix logger deprecations (#766) @rjdebastiani
- Update dependencies and various autoupdate cleanups
## [5.3.2](https://github.com/jazzband/django-silk/tree/5.3.2) (2024-12-05)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/5.3.1..5.3.2)
**Fixes:**
- Fix missing image from jQuery UI 1.13.2 (#757) @Tatsh
**Maintenance and Cleanup:**
- Adds updated documentation on middleware ordering (#758) @SoyJoseC
- Updated python dependencies (#761, #760) @albertyw
## [5.3.1](https://github.com/jazzband/django-silk/tree/5.3.1) (2024-11-08)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/5.3.0..5.3.1)
**Fixes:**
- Fix missing jQuery UI images (#754) @Tatsh
- Fix swallowing exceptions when processing response in silk middleware (#753) @albertyw
## [5.3.0](https://github.com/jazzband/django-silk/tree/5.3.0) (2024-10-25)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/5.2.0..5.3.0)
**Note: this release removes support for Django 3.2 and Python 3.8**
**Features/Enhancements:**
- Support python 3.13 (#747)
**Fixes:**
- Upgrade jQuery-UI to 1.13.2 to fix XSS vulnerability (#742)
**Maintenance and Cleanup:**
- Remove Django 3.2 support (#736)
- Drop support for python 3.8 (#749)
- Update python dependencies (#748)
## [5.2.0](https://github.com/jazzband/django-silk/tree/5.2.0) (2024-08-17)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/5.1.0..5.2.0)
**Features/Enhancements:**
- Support Django 5.1 (#734, #732) @albertyw
**Fixes:**
- Fix when Session, Authentication or Message middleware are not present (#667) @mgaligniana
- Update 'tables_involved' property to include tables from UPDATE operation (#717) @emregeldegul
- Fix double-escaping of the curl and Python example code (#709) @SpecLad
- Correct units in profiling and requests pages (#725) @ka28kumar
**Maintenance and Cleanup:**
- Update python dependencies (#733) @albertyw
- Refactor SQL query time calculation to use Django aggregation (#720) @beltagymohamed
- Fix test failures on Windows (#707) @SpecLad
- Update workflow actions (#700) @albertyw
- Update test matrix to latest version of django, postgres, and mariadb #701) @albertyw
## [5.1.0](https://github.com/jazzband/django-silk/tree/5.1.0) (2023-12-30)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/5.0.4..5.1.0)
**Upgrading:**
This release includes [Fix deprecation warning for get_storage_class #669](https://github.com/jazzband/django-silk/pull/669)
which deprecates `SILKY_STORAGE_CLASS`. Users should instead use the Django
`STORAGES` configuration. See [README](https://github.com/albertyw/django-silk/blob/master/README.md#profiling)
and [Django documentation](https://docs.djangoproject.com/en/5.0/ref/settings/#std-setting-STORAGES)
for more information.
Also, for python 3.12, the `cProfile` stdlib library cannot be enabled multiple times concurrently.
Silk will therefore skip profiling if another profile is already enabled.
**Features/Enhancements:**
- Allow option to delete profiles (#652) @viralj
**Fixes:**
- Gracefully error out when there are concurrent profilers (#692) @albertyw
- Always disable cProfile as part of cleanup (#699) @albertyw
- Fix when Session, Authentication or Message middlewares are not present (#667) @mgaligniana
**Maintenance and Cleanup:**
- Fix deprecation warning for get_storage_class (#669) @albertyw
- Support Django 4.2 (#685) @albertyw
- Support python 3.12 (#683) @albertyw
- Support Django 5 (#686) @albertyw
- Remove deprecated datetime.timezone.utc (#687) @albertyw
- Derive version from importlib (#697) @robinchow
**Dependencies:**
- Update python dependencies (#693) @albertyw
## [5.0.4](https://github.com/jazzband/django-silk/tree/5.0.4) (2023-09-17)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/5.0.3..5.0.4)
**Features/Enhancements:**
- Handle case-insensitive sensitive headers (#674) @shtimn
- Add a "pagetitle" block to Silky templates (#661) @vsajip
- Allow to generate more informative profile file name (#638) @k4rl85
**Maintenance and Cleanup:**
- Remove unsupported versions of Django and Python (#668) @albertyw
- Outsource all inline scripts and styles (#635) @sgelis
- Remove support for looking up headers on django <3.2 (#643) @albertyw
**Dependencies:**
- Update python dependencies (#677) @albertyw
## [5.0.3](https://github.com/jazzband/django-silk/tree/5.0.3) (2023-01-12)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/5.0.2..5.0.3)
**Fixes:**
- #46 Retain ordering, view style and limit (#614)
- #157 prevent encoding errors in params (#617)
- #594 Silk fails on constraint check queries (#618) (Fixes compatibility with Django 4.1)
**Features/Enhancements:**
- #132 Add action on sql query list (#611)
- traceback only when needed (#387)
**Dependencies:**
- #625 Drop dependency to jinja2
## [5.0.2](https://github.com/jazzband/django-silk/tree/5.0.2) (2022-10-12)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/5.0.1...5.0.2)
**Fixes:**
- Multipart forms and RawPostDataException (#592)
- Decrease unnecessary database hits (#587) (#588)
**Features/Enhancements:**
- Remove unneeded pytz package (#603)
- Use contextlib in test_profile_parser (#590)
- Add support for storages, that don't implement full filesystem path (#596)
## [5.0.1](https://github.com/jazzband/django-silk/tree/5.0.1) (2022-07-03)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/5.0.0...5.0.1)
**Fixes:**
- Add jquery UI 1.13.1 images and fix collectstatic (#576)
## [5.0.0](https://github.com/jazzband/django-silk/tree/5.0.0) (2022-06-20)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/4.4.0...5.0.0)
**Features/Enhancements:**
- Drop support for Django 2.2 (EOL) (#567)
- Added silk_request_garbage_collect command for out-of-band garbage collection. (#541)
## [4.4.1](https://github.com/jazzband/django-silk/tree/4.4.1) (2022-07-03)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/4.4.0...4.4.1)
**Fixes:**
- Add jquery UI 1.13.1 images and fix collectstatic (#576)
## [4.4.0](https://github.com/jazzband/django-silk/tree/4.4.0) (2022-06-20)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/4.3.0...4.4.0)
**Features/Enhancements:**
- Switch 'Apply' and 'Clear all filters' ordering
- Make filters on Requests tab more visible
- Add small margin for filter selects
- Add 'Clear all filters' button
- Add message when there are no requests to display
- Making the error logging more accurate and explicit
- Fixing #530 - Adding support for SILKY_EXPLAIN_FLAGS
**Maintenance and Cleanup:**
- Remove unused js compilation pipeline (#561)
- Fix pre-commit-config
**Dependencies:**
- Update jquery to 3.6.0 and jquery-ui to 1.13.1 [#508]
- [pre-commit.ci] pre-commit autoupdate (#560, #571)
- Add django-upgrade to pre-commit hooks (#566)
**Moved to 5.0.0**
- Drop support for Django 2.2 (EOL) (#567)
## [4.3.0](https://github.com/jazzband/django-silk/tree/4.3.0) (2022-03-01)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/4.2.0...4.3.0)
**Fixes:**
- Use correct db in a multi db setup (https://github.com/jazzband/django-silk/issues/522)
**Dependencies:**
- Drop support for Python 3.6
- Add Python 3.10 compatibility
- Add Django 4.0 to tox.ini
- Update django version (#544)
- Django main (#528)
- Remove unneeded dependency Pygments
**Maintenance and Cleanup:**
- Jazzband: Created local 'CODE_OF_CONDUCT.md' from remote 'CODE_OF_CONDUCT.md'
- fix installation instructions in README
- Replace assertDictContainsSubset (#536)
- Fix issue avoid-misusing-assert-true found at https://codereview.doctor (#550)
- pre-commit autoupdate
## [4.2.0](https://github.com/jazzband/django-silk/tree/4.2.0) (2021-23-10)
:release-by: Asif Saif Uddin (@auvipy)
[Full Changelog](https://github.com/jazzband/django-silk/compare/4.1.0...4.2.0)
- #427 Passed wsgi request to SILKY_PYTHON_PROFILER_FUNC
- Added Django 3.1 & 3.2 to test matrix
- Replace url with re_path for Django 4.0
- Move CI to GitHub Actions. [\#460](https://github.com/jazzband/django-silk/pull/432) ([jezdez](https://github.com/jezdez))
- Do not crash when silk app is not included in urls
- Add the SILKY_JSON_ENSURE_ASCII configuration item to support Chinese
- Add row view for requests page (#440)
- RequestModelFactory: fallback if request body too large, fix #162 (#451)
- Add query execution plan to sql_detail (#452)
- Add Python 3.9 compatibility (#404)
- Replace re_path with path
- Fix transaction error for mysql
- parse query when count joins to match only Keyword
- fix: DB connection to ClearDB when multiple databases
- fix: DataCollector sql_queries model not found on filter(request=self.request)
- Generate missing row.css from sass
- Filter null values from most time overall summary
- Ensure sorting between longest requests
- Filter null values from most db time summary
- Ensure sorting between most db time requests
- Temporary fix for testing Django 2.2
- Fix egg metadata error
- Fixed a bug that the profile tab could not be opened when the source code contains japanese
- fix incorrectly made decorator
- Ensure sorting between most db queries requests
- Add tests that access the actual DB (#493)
- remove python 2 style codes from across the codebase
- Fix broken test on Windows 10 (SQLite) (#504)
- Remove Make Migrations (#503)
- Add Python 3.10 compatibility (#527)
## [4.1.0](https://github.com/jazzband/django-silk/tree/4.1.0) (2020-08-07)
[Full Changelog](https://github.com/jazzband/django-silk/compare/4.0.1...4.1.0)
**New features/Implemented enhancements:**
- Make compatible with Django 3.1 [\#432](https://github.com/jazzband/django-silk/pull/432) ([Tirzono](https://github.com/Tirzono))
**Fixed bugs:**
- Capture entire key name during cleansing in \_mask\_credentials [\#414](https://github.com/jazzband/django-silk/pull/414) ([ThePumpingLemma](https://github.com/ThePumpingLemma))
- Clear DB error when configuring silk to use a non-' default' database [\#417](https://github.com/jazzband/django-silk/pull/417) ([eshxcmhk](https://github.com/eshxcmhk))
- Fix force\_text RemovedInDjango40Warning [\#422](https://github.com/jazzband/django-silk/pull/422) ([justinmayhew](https://github.com/justinmayhew))
**Closed issues:**
- \_mask\_credentials uses UGC in a regex substitution [\#410](https://github.com/jazzband/django-silk/issues/410) ([barm](https://github.com/barm))
- Django Silk is not compatible with Django 3.1: EmptyResultSet is removed in Django 3.1 [\#431](https://github.com/jazzband/django-silk/issues/431) ([Tirzono](https://github.com/Tirzono))
**Merged pull requests:**
- Wrap re.sub() in try-except [\#412](https://github.com/jazzband/django-silk/pull/412) ([bambookchos](https://github.com/bambookchos))
- Replace the call to re.findall with re.sub in \_mask\_credentials so matched values are not treated as regex patterns [\#413](https://github.com/jazzband/django-silk/pull/413) ([ThePumpingLemma](https://github.com/ThePumpingLemma))
- Capture entire key name during cleansing in \_mask\_credentials [\#414](https://github.com/jazzband/django-silk/pull/414) ([ThePumpingLemma](https://github.com/ThePumpingLemma))
- Clear DB error when configuring silk to use a non-' default' database [\#417](https://github.com/jazzband/django-silk/pull/417) ([eshxcmhk](https://github.com/eshxcmhk))
- Fix force\_text RemovedInDjango40Warning [\#422](https://github.com/jazzband/django-silk/pull/422) ([justinmayhew](https://github.com/justinmayhew))
- Make compatible with Django 3.1 [\#432](https://github.com/jazzband/django-silk/pull/432) ([Tirzono](https://github.com/Tirzono))
- Update README.md django-silk is tested with Django 3.1 [\#433](https://github.com/jazzband/django-silk/pull/433) ([Tirzono](https://github.com/Tirzono))
## [4.0.1](https://github.com/jazzband/django-silk/tree/4.0.1) (2020-03-12)
[Full Changelog](https://github.com/jazzband/django-silk/compare/4.0.0...4.0.1)
**New features/Implemented enhancements:**
- Restructured clear db HTML [\#399](https://github.com/jazzband/django-silk/pull/399) ([nasirhjafri](https://github.com/nasirhjafri))
- JS workflow cleanup [\#397](https://github.com/jazzband/django-silk/pull/397) ([nasirhjafri](https://github.com/nasirhjafri))
- Refactor QA setup [\#393](https://github.com/jazzband/django-silk/pull/393) ([aleksihakli](https://github.com/aleksihakli))
**Fixed bugs:**
- docs: Fix simple typo, tracebackk -> traceback [\#406](https://github.com/jazzband/django-silk/pull/406) ([timgates42](https://github.com/timgates42))
- Clear DB page doesn't work with PostgreSQL and SQLite [\#396](https://github.com/jazzband/django-silk/pull/396) ([nasirhjafri](https://github.com/nasirhjafri))
**Closed issues:**
- The "Clear DB" page doesn't work with PostgreSQL [\#395](https://github.com/jazzband/django-silk/issues/395) ([Ikalou](https://github.com/Ikalou))
**Merged pull requests:**
- docs: Fix simple typo, tracebackk -> traceback [\#406](https://github.com/jazzband/django-silk/pull/406) ([timgates42](https://github.com/timgates42))
- Restructured clear db HTML [\#399](https://github.com/jazzband/django-silk/pull/399) ([nasirhjafri](https://github.com/nasirhjafri))
- JS workflow cleanup [\#397](https://github.com/jazzband/django-silk/pull/397) ([nasirhjafri](https://github.com/nasirhjafri))
- Clear DB page doesn't work with PostgreSQL and SQLite [\#396](https://github.com/jazzband/django-silk/pull/396) ([nasirhjafri](https://github.com/nasirhjafri))
- Refactor QA setup [\#393](https://github.com/jazzband/django-silk/pull/393) ([aleksihakli](https://github.com/aleksihakli))
## [4.0.0](https://github.com/jazzband/django-silk/tree/4.0.0) (2020-01-09)
[Full Changelog](https://github.com/jazzband/django-silk/compare/3.0.4...4.0.0)
**New features/Implemented enhancements:**
- Ability to clean up all requests/queries [\#368](https://github.com/jazzband/django-silk/pull/368) ([nasirhjafri](https://github.com/nasirhjafri))
- Used bulk_create to save number of queries [\#370](https://github.com/jazzband/django-silk/pull/370) ([nasirhjafri](https://github.com/nasirhjafri))
- Dropped Python 2 and 3.4 support [\#380](https://github.com/jazzband/django-silk/pull/380) ([munza](https://github.com/munza))
- Added Python 3.8 support [\#380](https://github.com/jazzband/django-silk/pull/380) ([nasirhjafri](https://github.com/nasirhjafri))
- Removed django<2.2 support and added django 3.0 support [\#385](https://github.com/jazzband/django-silk/pull/385) ([nasirhjafri](https://github.com/nasirhjafri))
- Add function support for enabling profiling [\#391](https://github.com/jazzband/django-silk/pull/391) ([tredzko](https://github.com/tredzko))
**Fixed bugs:**
- Mask authorization header [\#376](https://github.com/jazzband/django-silk/pull/376) ([StefanMich](https://github.com/StefanMich))
**Closed issues:**
- Ability to clean up all requests/queries [\#365](https://github.com/jazzband/django-silk/issues/365)
- Use bulk_create to save number of queries [\#369](https://github.com/jazzband/django-silk/issues/369)
- Headers are not sanitized [\#375](https://github.com/jazzband/django-silk/issues/375)
- Django 3 support [\#382](https://github.com/jazzband/django-silk/issues/382)
- Support functional cProfile enable [\#390](https://github.com/jazzband/django-silk/issues/390)
**Merged pull requests:**
- Mask authorization header [\#376](https://github.com/jazzband/django-silk/pull/376) ([StefanMich](https://github.com/StefanMich))
- Ability to clean up all requests/queries [\#368](https://github.com/jazzband/django-silk/pull/368) ([nasirhjafri](https://github.com/nasirhjafri))
- Used bulk_create to save number of queries [\#370](https://github.com/jazzband/django-silk/pull/370) ([nasirhjafri](https://github.com/nasirhjafri))
- Dropped Python 2 and 3.4 support [\#380](https://github.com/jazzband/django-silk/pull/380) ([munza](https://github.com/munza))
- Added Python 3.8 support [\#380](https://github.com/jazzband/django-silk/pull/380) ([nasirhjafri](https://github.com/nasirhjafri))
- Removed django<2.2 support and added django 3.0 support [\#385](https://github.com/jazzband/django-silk/pull/385) ([nasirhjafri](https://github.com/nasirhjafri))
- Add function support for enabling profiling [\#391](https://github.com/jazzband/django-silk/pull/391) ([tredzko](https://github.com/tredzko))
## [3.0.4](https://github.com/jazzband/django-silk/tree/3.0.4) (2019-08-12)
[Full Changelog](https://github.com/jazzband/django-silk/compare/3.0.2...3.0.4)
**Implemented enhancements:**
- templates: limit select width to its container one [\#351](https://github.com/jazzband/django-silk/pull/351) ([xrmx](https://github.com/xrmx))
- Clean up RemovedInDjango30Warning with {% load staticfiles %} [\#353](https://github.com/jazzband/django-silk/pull/353) ([devmonkey22](https://github.com/devmonkey22))
- Simplify pattern masking and handle dicts [\#355](https://github.com/jazzband/django-silk/pull/355) ([Chris7](https://github.com/Chris7))
**Fixed bugs:**
- Fix masking sensitive data in batch JSON request [\#342](https://github.com/jazzband/django-silk/pull/342) ([nikolaik](https://github.com/nikolaik))
- Fix project url on PyPi [\#343](https://github.com/jazzband/django-silk/pull/343) ([luzfcb](https://github.com/luzfcb))
**Closed issues:**
- Clean up RemovedInDjango30Warning warning re `load staticfiles` in Django 2.1+ [\#352](https://github.com/jazzband/django-silk/issues/352)
**Merged pull requests:**
- Fix masking sensitive data in batch JSON request [\#342](https://github.com/jazzband/django-silk/pull/342) ([nikolaik](https://github.com/nikolaik))
- Fix project url on PyPi [\#343](https://github.com/jazzband/django-silk/pull/343) ([luzfcb](https://github.com/luzfcb))
- templates: limit select width to its container one [\#351](https://github.com/jazzband/django-silk/pull/351) ([xrmx](https://github.com/xrmx))
- Clean up RemovedInDjango30Warning with {% load staticfiles %} [\#353](https://github.com/jazzband/django-silk/pull/353) ([devmonkey22](https://github.com/devmonkey22))
- Simplify pattern masking and handle dicts [\#355](https://github.com/jazzband/django-silk/pull/355) ([Chris7](https://github.com/Chris7))
## [3.0.2](https://github.com/jazzband/django-silk/tree/3.0.2) (2019-04-23)
[Full Changelog](https://github.com/jazzband/django-silk/compare/3.0.1...3.0.2)
**Implemented enhancements:**
- Add testing support for django 2.2 [\#340](https://github.com/jazzband/django-silk/pull/340) ([mbeacom](https://github.com/mbeacom))
- SILKY\_MIDDLEWARE\_CLASS option [\#334](https://github.com/jazzband/django-silk/pull/334) ([vartagg](https://github.com/vartagg))
**Fixed bugs:**
- Long url path causes Http 500 [\#312](https://github.com/jazzband/django-silk/issues/312)
**Closed issues:**
- Permission checking is skipped due to order of silk\_profile decorator [\#336](https://github.com/jazzband/django-silk/issues/336)
- Support gprof2dot 2017.09.19 [\#332](https://github.com/jazzband/django-silk/issues/332)
- Duplicate \#310 [\#328](https://github.com/jazzband/django-silk/issues/328)
- Profiling management commands [\#327](https://github.com/jazzband/django-silk/issues/327)
- NoReverseMatch at /cart/detail/ Reverse for 'cart\_add' with arguments not found. [\#324](https://github.com/jazzband/django-silk/issues/324)
- Request body sanitization [\#305](https://github.com/jazzband/django-silk/issues/305)
- How to profile middleware? [\#303](https://github.com/jazzband/django-silk/issues/303)
- Disabling Silk for specific URLs [\#292](https://github.com/jazzband/django-silk/issues/292)
- silk\_clear\_request\_log fails on Postgres [\#290](https://github.com/jazzband/django-silk/issues/290)
- silk profile is not work, with dango-version 2.0.2 and django-silk version 2.0.0 [\#277](https://github.com/jazzband/django-silk/issues/277)
- DataError: value too long for type character varying\(190\) [\#179](https://github.com/jazzband/django-silk/issues/179)
**Merged pull requests:**
- Update gprof2dot requirement [\#333](https://github.com/jazzband/django-silk/pull/333) ([Regzon](https://github.com/Regzon))
- Make Request.garbage\_collect cheaper [\#331](https://github.com/jazzband/django-silk/pull/331) ([xrmx](https://github.com/xrmx))
- Sort view filters values [\#330](https://github.com/jazzband/django-silk/pull/330) ([xrmx](https://github.com/xrmx))
- Update Travis CI matrix [\#326](https://github.com/jazzband/django-silk/pull/326) ([kevin-brown](https://github.com/kevin-brown))
- Fix unit for max response body size in readme [\#325](https://github.com/jazzband/django-silk/pull/325) ([st4lk](https://github.com/st4lk))
- Mask sensitive data [\#322](https://github.com/jazzband/django-silk/pull/322) ([egichuri](https://github.com/egichuri))
- Disclose security issues [\#321](https://github.com/jazzband/django-silk/pull/321) ([acu192](https://github.com/acu192))
- If there is no DataCollector\(\).request then don't wrap sql queries [\#320](https://github.com/jazzband/django-silk/pull/320) ([rwlogel](https://github.com/rwlogel))
- Prevent path or view\_name being longer than 190 characters [\#314](https://github.com/jazzband/django-silk/pull/314) ([smaccona](https://github.com/smaccona))
- Disable postgres USER triggers [\#299](https://github.com/jazzband/django-silk/pull/299) ([gforcada](https://github.com/gforcada))
- Fix \#297 remove explicit byte string from migration 0003 [\#298](https://github.com/jazzband/django-silk/pull/298) ([florianm](https://github.com/florianm))
- Modernize middleware [\#296](https://github.com/jazzband/django-silk/pull/296) ([gforcada](https://github.com/gforcada))
- Added a simple view in request detail context allowing to get python profile [\#295](https://github.com/jazzband/django-silk/pull/295) ([laurentb2](https://github.com/laurentb2))
## [3.0.1](https://github.com/jazzband/django-silk/tree/3.0.1) (2018-07-03)
[Full Changelog](https://github.com/jazzband/django-silk/compare/3.0.0...3.0.1)
**Closed issues:**
- ProgrammingError raised from silk\_clear\_request\_log [\#293](https://github.com/jazzband/django-silk/issues/293)
- Make a new release of django-silk [\#282](https://github.com/jazzband/django-silk/issues/282)
**Merged pull requests:**
- \#290 Fix silk\_clear\_request\_log errors on Postgres [\#291](https://github.com/jazzband/django-silk/pull/291) ([devmonkey22](https://github.com/devmonkey22))
## [3.0.0](https://github.com/jazzband/django-silk/tree/3.0.0) (2018-05-15)
[Full Changelog](https://github.com/jazzband/django-silk/compare/2.0.0...3.0.0)
**Implemented enhancements:**
- Limiting request/response data don't available in pypi version [\#218](https://github.com/jazzband/django-silk/issues/218)
**Fixed bugs:**
- silk\_clear\_request\_log taking longer than 30 minutes [\#239](https://github.com/jazzband/django-silk/issues/239)
**Closed issues:**
- Meta profiling does not work with Django 2.0 and higher [\#274](https://github.com/jazzband/django-silk/issues/274)
- Force opening a new window for SQL queries is very annoying [\#271](https://github.com/jazzband/django-silk/issues/271)
- DB Deadlock when stress testing with silk [\#265](https://github.com/jazzband/django-silk/issues/265)
- proplem with propagating code to pypi [\#264](https://github.com/jazzband/django-silk/issues/264)
- PSA: Cleanup silk\_requests before updating to 1.1.0 [\#261](https://github.com/jazzband/django-silk/issues/261)
- Release 2.0.0 [\#259](https://github.com/jazzband/django-silk/issues/259)
**Merged pull requests:**
- Remove gitter links [\#285](https://github.com/jazzband/django-silk/pull/285) ([albertyw](https://github.com/albertyw))
- Release 3.0.0 [\#283](https://github.com/jazzband/django-silk/pull/283) ([albertyw](https://github.com/albertyw))
- Fix garbage collection logic for small tables [\#280](https://github.com/jazzband/django-silk/pull/280) ([albertyw](https://github.com/albertyw))
- Fix view name [\#278](https://github.com/jazzband/django-silk/pull/278) ([drppi44](https://github.com/drppi44))
- Revert "Opening sql queries in new tab is very useful" [\#276](https://github.com/jazzband/django-silk/pull/276) ([albertyw](https://github.com/albertyw))
- Fix issue \#274 [\#275](https://github.com/jazzband/django-silk/pull/275) ([MKolman](https://github.com/MKolman))
- Truncate tables when running silk\_clear\_request\_log [\#270](https://github.com/jazzband/django-silk/pull/270) ([albertyw](https://github.com/albertyw))
- Makes example\_app.models.Product.photo.upload\_to a string instead of bytes [\#268](https://github.com/jazzband/django-silk/pull/268) ([vbawa](https://github.com/vbawa))
- Make garbage collection filter more efficient [\#267](https://github.com/jazzband/django-silk/pull/267) ([albertyw](https://github.com/albertyw))
- Drop support for Django \< 1.11 and remove workarounds [\#266](https://github.com/jazzband/django-silk/pull/266) ([jdufresne](https://github.com/jdufresne))
## [2.0.0](https://github.com/jazzband/django-silk/tree/2.0.0) (2018-01-16)
[Full Changelog](https://github.com/jazzband/django-silk/compare/1.1.0...2.0.0)
**Fixed bugs:**
- Links for Readme.md not working. [\#250](https://github.com/jazzband/django-silk/issues/250)
**Closed issues:**
- pypi version [\#252](https://github.com/jazzband/django-silk/issues/252)
- Remove support for django 1.7 [\#247](https://github.com/jazzband/django-silk/issues/247)
- migrations/0005\_increase\_request\_prof\_file\_length.py does not match code [\#244](https://github.com/jazzband/django-silk/issues/244)
- Excessive number of queries in class method profile [\#240](https://github.com/jazzband/django-silk/issues/240)
- Django 2.0 support [\#229](https://github.com/jazzband/django-silk/issues/229)
- Create new release of silk [\#187](https://github.com/jazzband/django-silk/issues/187)
**Merged pull requests:**
- Release 2.0.0 [\#260](https://github.com/jazzband/django-silk/pull/260) ([albertyw](https://github.com/albertyw))
- function declaration fix [\#254](https://github.com/jazzband/django-silk/pull/254) ([Yolley](https://github.com/Yolley))
- Opening sql queries in new tab is very useful [\#253](https://github.com/jazzband/django-silk/pull/253) ([lokeshatbigbasket](https://github.com/lokeshatbigbasket))
- Use force\_text in ResponseModelFactory to avoid b' prefix in django 2 [\#251](https://github.com/jazzband/django-silk/pull/251) ([aadu](https://github.com/aadu))
- Remove django support 1.7 [\#249](https://github.com/jazzband/django-silk/pull/249) ([albertyw](https://github.com/albertyw))
- Remove django 1.6 references [\#248](https://github.com/jazzband/django-silk/pull/248) ([albertyw](https://github.com/albertyw))
- Update development status and python support to package classifiers [\#246](https://github.com/jazzband/django-silk/pull/246) ([albertyw](https://github.com/albertyw))
- fix migration for request.prof\_file field [\#245](https://github.com/jazzband/django-silk/pull/245) ([dennybiasiolli](https://github.com/dennybiasiolli))
- fix alternative github tags installation url [\#243](https://github.com/jazzband/django-silk/pull/243) ([dennybiasiolli](https://github.com/dennybiasiolli))
## [1.1.0](https://github.com/jazzband/django-silk/tree/1.1.0) (2017-12-27)
[Full Changelog](https://github.com/jazzband/django-silk/compare/1.0.0...1.1.0)
**Implemented enhancements:**
- RemovedInDjango20Warning: on\_delete will be a required arg for OneToOneField in Django 2.0. [\#183](https://github.com/jazzband/django-silk/issues/183)
- README missing info about how to import decorator [\#180](https://github.com/jazzband/django-silk/issues/180)
- Use redis for backend [\#163](https://github.com/jazzband/django-silk/issues/163)
- Difficult to install on windows: Needs wheels. [\#149](https://github.com/jazzband/django-silk/issues/149)
- Organise cProfile output as a sortable, more organised table. [\#33](https://github.com/jazzband/django-silk/issues/33)
**Closed issues:**
- Silk is incompatible with django-fullclean [\#219](https://github.com/jazzband/django-silk/issues/219)
- The dashboard shows views with no queries as most time taken in database [\#217](https://github.com/jazzband/django-silk/issues/217)
- No end\_time for any captured request [\#213](https://github.com/jazzband/django-silk/issues/213)
- Bad alignment in profile table [\#206](https://github.com/jazzband/django-silk/issues/206)
- Visualization not visible [\#205](https://github.com/jazzband/django-silk/issues/205)
- Storage class as a setting [\#202](https://github.com/jazzband/django-silk/issues/202)
- Consider moving project to jazzband [\#184](https://github.com/jazzband/django-silk/issues/184)
- Request detail page never loads [\#175](https://github.com/jazzband/django-silk/issues/175)
- Number of queries and time showing as 0 [\#174](https://github.com/jazzband/django-silk/issues/174)
- NameError: name 'silk\_profile' is not defined [\#172](https://github.com/jazzband/django-silk/issues/172)
- Query time-outs [\#158](https://github.com/jazzband/django-silk/issues/158)
**Merged pull requests:**
- Release 1.1.0 [\#242](https://github.com/jazzband/django-silk/pull/242) ([albertyw](https://github.com/albertyw))
- Update package versions for test project [\#241](https://github.com/jazzband/django-silk/pull/241) ([albertyw](https://github.com/albertyw))
- Return immediately [\#235](https://github.com/jazzband/django-silk/pull/235) ([Stranger6667](https://github.com/Stranger6667))
- Fix missing db\_time field [\#234](https://github.com/jazzband/django-silk/pull/234) ([albertyw](https://github.com/albertyw))
- Test django 2 in travis [\#233](https://github.com/jazzband/django-silk/pull/233) ([albertyw](https://github.com/albertyw))
- Lint silk directory and fix a python 3 blocker [\#232](https://github.com/jazzband/django-silk/pull/232) ([albertyw](https://github.com/albertyw))
- Fix flaky test by rounding off floats [\#231](https://github.com/jazzband/django-silk/pull/231) ([albertyw](https://github.com/albertyw))
- Fix github silk links to point to jazzband [\#230](https://github.com/jazzband/django-silk/pull/230) ([albertyw](https://github.com/albertyw))
- Update docs to clarify how to install the middleware [\#228](https://github.com/jazzband/django-silk/pull/228) ([albertyw](https://github.com/albertyw))
- Fix Django 2 deprecations [\#227](https://github.com/jazzband/django-silk/pull/227) ([albertyw](https://github.com/albertyw))
- Add extra documentation covering environment variables and running tests [\#226](https://github.com/jazzband/django-silk/pull/226) ([richardnias](https://github.com/richardnias))
- Filter out views that took no time in the database for the most time … [\#225](https://github.com/jazzband/django-silk/pull/225) ([hvdklauw](https://github.com/hvdklauw))
- Removed typo errors and fixed contractions [\#222](https://github.com/jazzband/django-silk/pull/222) ([basifat](https://github.com/basifat))
- gprof2dot had a breaking change in 2017.09.19 [\#221](https://github.com/jazzband/django-silk/pull/221) ([richardnias](https://github.com/richardnias))
- Allow prof\_file to be blank, not null [\#220](https://github.com/jazzband/django-silk/pull/220) ([richardnias](https://github.com/richardnias))
- Changed the theme of gprof2dot output to be more inline with rest of silk design [\#210](https://github.com/jazzband/django-silk/pull/210) ([danielbradburn](https://github.com/danielbradburn))
- configurable storage class [\#204](https://github.com/jazzband/django-silk/pull/204) ([smcoll](https://github.com/smcoll))
- increase Request.prof\_file max\_length to 300 [\#203](https://github.com/jazzband/django-silk/pull/203) ([smcoll](https://github.com/smcoll))
- \#33 organise cprofile output as a sortable table [\#200](https://github.com/jazzband/django-silk/pull/200) ([danielbradburn](https://github.com/danielbradburn))
- left align pre tag text [\#199](https://github.com/jazzband/django-silk/pull/199) ([smcoll](https://github.com/smcoll))
- add .venv\* to .gitignore [\#198](https://github.com/jazzband/django-silk/pull/198) ([danielbradburn](https://github.com/danielbradburn))
- Add missing gprof2dot to setup.py [\#197](https://github.com/jazzband/django-silk/pull/197) ([danielbradburn](https://github.com/danielbradburn))
- README changes for visualisation and sql summary table sorting [\#195](https://github.com/jazzband/django-silk/pull/195) ([danielbradburn](https://github.com/danielbradburn))
- Added UI element to filter requests by http verb [\#194](https://github.com/jazzband/django-silk/pull/194) ([danielbradburn](https://github.com/danielbradburn))
- Sortable sql table [\#193](https://github.com/jazzband/django-silk/pull/193) ([danielbradburn](https://github.com/danielbradburn))
- Visualize profile result [\#192](https://github.com/jazzband/django-silk/pull/192) ([danielbradburn](https://github.com/danielbradburn))
- Added status code filter [\#191](https://github.com/jazzband/django-silk/pull/191) ([danielbradburn](https://github.com/danielbradburn))
- Set jazzband to limit the number of rows of request/response data [\#190](https://github.com/jazzband/django-silk/pull/190) ([albertyw](https://github.com/albertyw))
- Add python 3.6 to travis config [\#189](https://github.com/jazzband/django-silk/pull/189) ([albertyw](https://github.com/albertyw))
- Add explicit on\_delete to foreign key and one to one relationships [\#188](https://github.com/jazzband/django-silk/pull/188) ([albertyw](https://github.com/albertyw))
- Replace django-silk organization with jazzband [\#186](https://github.com/jazzband/django-silk/pull/186) ([albertyw](https://github.com/albertyw))
- Jazzband migration [\#185](https://github.com/jazzband/django-silk/pull/185) ([mtford90](https://github.com/mtford90))
- Deprecation: update to warning [\#177](https://github.com/jazzband/django-silk/pull/177) ([lammertw](https://github.com/lammertw))
- Add text-align property to pyprofile class for readability [\#176](https://github.com/jazzband/django-silk/pull/176) ([jeffreyckchau](https://github.com/jeffreyckchau))
- Mention collectstatic [\#173](https://github.com/jazzband/django-silk/pull/173) ([goetzk](https://github.com/goetzk))
## [1.0.0](https://github.com/jazzband/django-silk/tree/1.0.0) (2017-03-25)
[Full Changelog](https://github.com/jazzband/django-silk/compare/0.7.3...1.0.0)
**Fixed bugs:**
- Silk shows 0 time for all requests? [\#161](https://github.com/jazzband/django-silk/issues/161)
- Failed to install index for silk.Request model: \(1071, 'Specified key was too long; max key length is 767 bytes'\) [\#38](https://github.com/jazzband/django-silk/issues/38)
- IntegrityError: duplicate key value violates unique constraint "silk\_response\_request\_id\_key" [\#26](https://github.com/jazzband/django-silk/issues/26)
**Closed issues:**
- There is no reference to download a profile [\#170](https://github.com/jazzband/django-silk/issues/170)
- Build fails occasionally due to "missing manage.py" [\#32](https://github.com/jazzband/django-silk/issues/32)
**Merged pull requests:**
- Fixes \#170 [\#171](https://github.com/jazzband/django-silk/pull/171) ([perdy](https://github.com/perdy))
- Wheel support [\#168](https://github.com/jazzband/django-silk/pull/168) ([auvipy](https://github.com/auvipy))
- Improved MySQL support [\#167](https://github.com/jazzband/django-silk/pull/167) ([smaccona](https://github.com/smaccona))
- some style improvements [\#166](https://github.com/jazzband/django-silk/pull/166) ([auvipy](https://github.com/auvipy))
- Update travis matrix and requirments dependencies versions [\#165](https://github.com/jazzband/django-silk/pull/165) ([auvipy](https://github.com/auvipy))
- Fixes \#161 [\#164](https://github.com/jazzband/django-silk/pull/164) ([perdy](https://github.com/perdy))
## [0.7.3](https://github.com/jazzband/django-silk/tree/0.7.3) (2017-02-13)
[Full Changelog](https://github.com/jazzband/django-silk/compare/0.7.2...0.7.3)
**Fixed bugs:**
- Profiling files get copied into MEDIA\_ROOT [\#151](https://github.com/jazzband/django-silk/issues/151)
- Bad requirements for postgres based installations [\#142](https://github.com/jazzband/django-silk/issues/142)
**Closed issues:**
- Middleware setting in Django 1.10 [\#159](https://github.com/jazzband/django-silk/issues/159)
- When installing silk asking for mysql library. But I'm using postgresql. [\#150](https://github.com/jazzband/django-silk/issues/150)
- No Silk profiling was performed for this request. Use the silk\_profile decorator/context manager to do so. [\#147](https://github.com/jazzband/django-silk/issues/147)
- ProgrammingError on postgresql [\#146](https://github.com/jazzband/django-silk/issues/146)
- \[Error\]\[Bug\]adding silk middleware in MIDDLEWARE causes ImportError [\#108](https://github.com/jazzband/django-silk/issues/108)
**Merged pull requests:**
- Update middleware setting for Django \>= 1.10 [\#160](https://github.com/jazzband/django-silk/pull/160) ([ukjin1192](https://github.com/ukjin1192))
- Add favorite icons [\#156](https://github.com/jazzband/django-silk/pull/156) ([phuong](https://github.com/phuong))
- Bugfix for issue \#153 [\#155](https://github.com/jazzband/django-silk/pull/155) ([Drache91](https://github.com/Drache91))
- Improve profile storage [\#152](https://github.com/jazzband/django-silk/pull/152) ([r3m0t](https://github.com/r3m0t))
## [0.7.2](https://github.com/jazzband/django-silk/tree/0.7.2) (2016-12-03)
[Full Changelog](https://github.com/jazzband/django-silk/compare/0.7.1...0.7.2)
**Closed issues:**
- Pypi version upload [\#141](https://github.com/jazzband/django-silk/issues/141)
**Merged pull requests:**
- Allow using Django 1.10 MIDDLEWARE setting instead of MIDDLEWARE\_CLASSES [\#148](https://github.com/jazzband/django-silk/pull/148) ([lockie](https://github.com/lockie))
- Travis config to test on the different django database backends. [\#145](https://github.com/jazzband/django-silk/pull/145) ([mattjegan](https://github.com/mattjegan))
- Updates exception handling to use Django DatabaseError class [\#144](https://github.com/jazzband/django-silk/pull/144) ([hanleyhansen](https://github.com/hanleyhansen))
- Fix for byte string incompatibility in ResponseModelFactory.body\(\) on py3 [\#143](https://github.com/jazzband/django-silk/pull/143) ([aljp](https://github.com/aljp))
## [0.7.1](https://github.com/jazzband/django-silk/tree/0.7.1) (2016-10-01)
[Full Changelog](https://github.com/jazzband/django-silk/compare/0.7.0...0.7.1)
**Merged pull requests:**
- Operational Error When Silk Is Used On Big SQL Queries [\#140](https://github.com/jazzband/django-silk/pull/140) ([hanleyhansen](https://github.com/hanleyhansen))
## [0.7.0](https://github.com/jazzband/django-silk/tree/0.7.0) (2016-09-21)
[Full Changelog](https://github.com/jazzband/django-silk/compare/0.6.2...0.7.0)
**Implemented enhancements:**
- Select a path to save profiling files [\#131](https://github.com/jazzband/django-silk/issues/131)
**Merged pull requests:**
- Remove trailing slashes in MANIFEST.in [\#139](https://github.com/jazzband/django-silk/pull/139) ([leifdenby](https://github.com/leifdenby))
- Django 1.10 compatibility [\#138](https://github.com/jazzband/django-silk/pull/138) ([shanx](https://github.com/shanx))
- Swap imports to avoid emitting warnings [\#136](https://github.com/jazzband/django-silk/pull/136) ([blag](https://github.com/blag))
- Profiler files path configurable [\#135](https://github.com/jazzband/django-silk/pull/135) ([javaguirre](https://github.com/javaguirre))
- Fix ignored content body [\#134](https://github.com/jazzband/django-silk/pull/134) ([aehlke](https://github.com/aehlke))
- Namespaced loggers [\#133](https://github.com/jazzband/django-silk/pull/133) ([aehlke](https://github.com/aehlke))
## [0.6.2](https://github.com/jazzband/django-silk/tree/0.6.2) (2016-07-28)
[Full Changelog](https://github.com/jazzband/django-silk/compare/0.6.1...0.6.2)
**Closed issues:**
- SnakeViz integration [\#83](https://github.com/jazzband/django-silk/issues/83)
**Merged pull requests:**
- don't crash when a route is 404 [\#129](https://github.com/jazzband/django-silk/pull/129) ([chrono](https://github.com/chrono))
## [0.6.1](https://github.com/jazzband/django-silk/tree/0.6.1) (2016-07-13)
[Full Changelog](https://github.com/jazzband/django-silk/compare/0.6.0...0.6.1)
**Closed issues:**
- Latest version of django-silk not installing because of missing dependency [\#127](https://github.com/jazzband/django-silk/issues/127)
- README.md missing in v0.6 [\#125](https://github.com/jazzband/django-silk/issues/125)
**Merged pull requests:**
- use any readme [\#128](https://github.com/jazzband/django-silk/pull/128) ([SzySteve](https://github.com/SzySteve))
## [0.6.0](https://github.com/jazzband/django-silk/tree/0.6.0) (2016-07-12)
[Full Changelog](https://github.com/jazzband/django-silk/compare/0.5.7...0.6.0)
**Closed issues:**
- Local Dev of Silk. Template Error. [\#121](https://github.com/jazzband/django-silk/issues/121)
- Using django six rather then maintaining one [\#112](https://github.com/jazzband/django-silk/issues/112)
- PyPi release [\#106](https://github.com/jazzband/django-silk/issues/106)
**Merged pull requests:**
- update pillow requirement so installation succeeds [\#124](https://github.com/jazzband/django-silk/pull/124) ([SzySteve](https://github.com/SzySteve))
- Give users the ability to export .prof binary files for every request [\#123](https://github.com/jazzband/django-silk/pull/123) ([hanleyhansen](https://github.com/hanleyhansen))
- Make Silk Great Again and Upgrade Dev Project [\#122](https://github.com/jazzband/django-silk/pull/122) ([hanleyhansen](https://github.com/hanleyhansen))
- make file paths clickable that don't start with a slash [\#120](https://github.com/jazzband/django-silk/pull/120) ([chrono](https://github.com/chrono))
- clear data store in chunks [\#119](https://github.com/jazzband/django-silk/pull/119) ([chrono](https://github.com/chrono))
- remove claim to support django 1.6 [\#118](https://github.com/jazzband/django-silk/pull/118) ([chrono](https://github.com/chrono))
- removed six six utils and tests [\#117](https://github.com/jazzband/django-silk/pull/117) ([auvipy](https://github.com/auvipy))
- used django utils six instead of sils utls six in some module [\#116](https://github.com/jazzband/django-silk/pull/116) ([auvipy](https://github.com/auvipy))
- Lint fix and code cleaning [\#114](https://github.com/jazzband/django-silk/pull/114) ([auvipy](https://github.com/auvipy))
- small updates [\#113](https://github.com/jazzband/django-silk/pull/113) ([auvipy](https://github.com/auvipy))
- Render function instead of render\_to\_response [\#111](https://github.com/jazzband/django-silk/pull/111) ([auvipy](https://github.com/auvipy))
- remove south migrations as not needed in less then 1.7 [\#110](https://github.com/jazzband/django-silk/pull/110) ([auvipy](https://github.com/auvipy))
- versions upgrade and obsolete versions removal [\#109](https://github.com/jazzband/django-silk/pull/109) ([auvipy](https://github.com/auvipy))
- Supporting django\<1.8 [\#107](https://github.com/jazzband/django-silk/pull/107) ([wm3ndez](https://github.com/wm3ndez))
## [0.5.7](https://github.com/jazzband/django-silk/tree/0.5.7) (2016-03-16)
[Full Changelog](https://github.com/jazzband/django-silk/compare/0.5.6...0.5.7)
**Implemented enhancements:**
- Unittesting [\#87](https://github.com/jazzband/django-silk/issues/87)
- Add Ascending/Descending sort order GET parameter in RequestsView [\#84](https://github.com/jazzband/django-silk/issues/84)
- Support binary response bodies [\#1](https://github.com/jazzband/django-silk/issues/1)
**Fixed bugs:**
- TemplateSyntaxError at /silk/ Invalid filter: 'silk\_date\_time' [\#82](https://github.com/jazzband/django-silk/issues/82)
**Closed issues:**
- base64 encoded responses break unit tests for Python3 [\#98](https://github.com/jazzband/django-silk/issues/98)
- Refactor Unit Tests to test new sort ordering structure. [\#96](https://github.com/jazzband/django-silk/issues/96)
- Running tests from the Travis config file fails because of difference in django-admin/manage.py [\#91](https://github.com/jazzband/django-silk/issues/91)
- Support for missing URL names in Django 1.8 and 1.9 [\#89](https://github.com/jazzband/django-silk/issues/89)
- UnicodeDecodeError in sql.py: leads to 500 internal error [\#85](https://github.com/jazzband/django-silk/issues/85)
**Merged pull requests:**
- remove simplejson [\#105](https://github.com/jazzband/django-silk/pull/105) ([digitaldavenyc](https://github.com/digitaldavenyc))
- Fixing Depreciation, Saving and Performance Tweaks [\#104](https://github.com/jazzband/django-silk/pull/104) ([Wrhector](https://github.com/Wrhector))
- Django 1.9 compatibility for the csrf context processor [\#100](https://github.com/jazzband/django-silk/pull/100) ([blag](https://github.com/blag))
- URL patterns are just Python lists for Django 1.9+ [\#99](https://github.com/jazzband/django-silk/pull/99) ([blag](https://github.com/blag))
- Refactor Unit Tests to test new sort ordering structure. [\#97](https://github.com/jazzband/django-silk/pull/97) ([trik](https://github.com/trik))
- Add Ascending/Descending sort order GET parameter in RequestsView [\#95](https://github.com/jazzband/django-silk/pull/95) ([trik](https://github.com/trik))
- Response bodies are now stored b64 encoded \(support for binary responses\). [\#94](https://github.com/jazzband/django-silk/pull/94) ([trik](https://github.com/trik))
- Unittests for models [\#93](https://github.com/jazzband/django-silk/pull/93) ([Alkalit](https://github.com/Alkalit))
- Conditional migration tests [\#92](https://github.com/jazzband/django-silk/pull/92) ([florisdenhengst](https://github.com/florisdenhengst))
- Added support for missing URL names in Django 1.8-1.9. [\#90](https://github.com/jazzband/django-silk/pull/90) ([florisdenhengst](https://github.com/florisdenhengst))
- Avoid errors when doing migrate command [\#86](https://github.com/jazzband/django-silk/pull/86) ([msaelices](https://github.com/msaelices))
- Namespace templatetags so they don't clash with existing application templatetags [\#81](https://github.com/jazzband/django-silk/pull/81) ([lmortimer](https://github.com/lmortimer))
- Added the use of Lambdas in settings.py to the README. [\#77](https://github.com/jazzband/django-silk/pull/77) ([bryson](https://github.com/bryson))
## [0.5.6](https://github.com/jazzband/django-silk/tree/0.5.6) (2015-09-06)
[Full Changelog](https://github.com/jazzband/django-silk/compare/0.5.5...0.5.6)
**Closed issues:**
- Post-processing static assets fails due to missing font files [\#51](https://github.com/jazzband/django-silk/issues/51)
**Merged pull requests:**
- Fixed report handling timing not included in meta-timing [\#76](https://github.com/jazzband/django-silk/pull/76) ([rodcloutier](https://github.com/rodcloutier))
- Support UUID in request headers [\#75](https://github.com/jazzband/django-silk/pull/75) ([rodcloutier](https://github.com/rodcloutier))
- test on latest django versions in travis [\#72](https://github.com/jazzband/django-silk/pull/72) ([nikolas](https://github.com/nikolas))
## [0.5.5](https://github.com/jazzband/django-silk/tree/0.5.5) (2015-06-04)
[Full Changelog](https://github.com/jazzband/django-silk/compare/0.5.3...0.5.5)
**Fixed bugs:**
- Pin six.py within silk to avoid version incompatibility. [\#70](https://github.com/jazzband/django-silk/issues/70)
**Closed issues:**
- IntegrityError: NOT NULL constraint failed: silk\_request.view\_name [\#71](https://github.com/jazzband/django-silk/issues/71)
## [0.5.3](https://github.com/jazzband/django-silk/tree/0.5.3) (2015-06-04)
[Full Changelog](https://github.com/jazzband/django-silk/compare/0.5.2...0.5.3)
**Closed issues:**
- null value in column "view\_name" violates not-null constraint [\#66](https://github.com/jazzband/django-silk/issues/66)
- Migrations do not work with Django 1.5.9 [\#64](https://github.com/jazzband/django-silk/issues/64)
**Merged pull requests:**
- It's not random, is it? [\#69](https://github.com/jazzband/django-silk/pull/69) ([peterbe](https://github.com/peterbe))
- Fix issue when view\_name was Null [\#67](https://github.com/jazzband/django-silk/pull/67) ([bartoszhernas](https://github.com/bartoszhernas))
## [0.5.2](https://github.com/jazzband/django-silk/tree/0.5.2) (2015-04-15)
[Full Changelog](https://github.com/jazzband/django-silk/compare/0.5.1...0.5.2)
**Merged pull requests:**
- Update model\_factory.py [\#62](https://github.com/jazzband/django-silk/pull/62) ([karabijavad](https://github.com/karabijavad))
## [0.5.1](https://github.com/jazzband/django-silk/tree/0.5.1) (2015-04-08)
[Full Changelog](https://github.com/jazzband/django-silk/compare/0.5...0.5.1)
**Implemented enhancements:**
- UTC time in templates [\#49](https://github.com/jazzband/django-silk/issues/49)
**Fixed bugs:**
- AttributeError: This StreamingHttpResponse instance has no `content` attribute [\#50](https://github.com/jazzband/django-silk/issues/50)
**Closed issues:**
- Django 1.8 support [\#55](https://github.com/jazzband/django-silk/issues/55)
- Should not have to manually add a logger for silk [\#53](https://github.com/jazzband/django-silk/issues/53)
## [0.5](https://github.com/jazzband/django-silk/tree/0.5) (2015-04-08)
[Full Changelog](https://github.com/jazzband/django-silk/compare/v0.4...0.5)
**Implemented enhancements:**
- 'thread.\_local' object has no attribute 'temp\_identifier' \(should log a warning stating that this is likely a middleware issue\) [\#52](https://github.com/jazzband/django-silk/issues/52)
- Check to see if process\_request of SilkyMiddleware has been called, and issue warnings on middleware placement if not [\#42](https://github.com/jazzband/django-silk/issues/42)
- Django 1.7 support [\#29](https://github.com/jazzband/django-silk/issues/29)
**Fixed bugs:**
- Django 1.5 support broken [\#60](https://github.com/jazzband/django-silk/issues/60)
**Closed issues:**
- Tests broken [\#61](https://github.com/jazzband/django-silk/issues/61)
- Deploying silk site-wide [\#56](https://github.com/jazzband/django-silk/issues/56)
- Migration error [\#54](https://github.com/jazzband/django-silk/issues/54)
- Silky doesn't work when django.middleware.gzip.GZipMiddleware is enabled [\#43](https://github.com/jazzband/django-silk/issues/43)
- static files not found problem [\#41](https://github.com/jazzband/django-silk/issues/41)
- No handlers could be found for logger "silk" [\#35](https://github.com/jazzband/django-silk/issues/35)
**Merged pull requests:**
- Add configuration option for custom intercept logic. [\#59](https://github.com/jazzband/django-silk/pull/59) ([kkaehler](https://github.com/kkaehler))
- commit\_on\_success -\> atomic, for 1.8, as commit\_on\_success was removed [\#58](https://github.com/jazzband/django-silk/pull/58) ([karabijavad](https://github.com/karabijavad))
- Update README.md [\#57](https://github.com/jazzband/django-silk/pull/57) ([karabijavad](https://github.com/karabijavad))
- Add a Gitter chat badge to README.md [\#48](https://github.com/jazzband/django-silk/pull/48) ([gitter-badger](https://github.com/gitter-badger))
- Tox integration added [\#47](https://github.com/jazzband/django-silk/pull/47) ([brmc](https://github.com/brmc))
- Edited ReadMe.md to avoid UnicodeDevodeError [\#44](https://github.com/jazzband/django-silk/pull/44) ([brmc](https://github.com/brmc))
- Added utf8 in curl query parameters [\#39](https://github.com/jazzband/django-silk/pull/39) ([ilvar](https://github.com/ilvar))
- Revert "Fix errors in manifest file" [\#37](https://github.com/jazzband/django-silk/pull/37) ([mtford90](https://github.com/mtford90))
- Fix IntegrityError caused by Request being saved 'None' raw\_body [\#36](https://github.com/jazzband/django-silk/pull/36) ([JannKleen](https://github.com/JannKleen))
- Fix errors in manifest file [\#34](https://github.com/jazzband/django-silk/pull/34) ([joaofrancese](https://github.com/joaofrancese))
## [v0.4](https://github.com/jazzband/django-silk/tree/v0.4) (2014-08-17)
[Full Changelog](https://github.com/jazzband/django-silk/compare/0.3.2...v0.4)
**Closed issues:**
- Live demo link is broken [\#30](https://github.com/jazzband/django-silk/issues/30)
**Merged pull requests:**
- Ability to not log every request, optimizations, db\_index, and a management command [\#31](https://github.com/jazzband/django-silk/pull/31) ([JoshData](https://github.com/JoshData))
## [0.3.2](https://github.com/jazzband/django-silk/tree/0.3.2) (2014-07-22)
[Full Changelog](https://github.com/jazzband/django-silk/compare/0.3.1...0.3.2)
**Fixed bugs:**
- No data profiled [\#25](https://github.com/jazzband/django-silk/issues/25)
- Incorrect interface for execute\_sql [\#24](https://github.com/jazzband/django-silk/issues/24)
**Closed issues:**
- Don't pin versions in setup.py [\#23](https://github.com/jazzband/django-silk/issues/23)
- Ability to clear old runs [\#14](https://github.com/jazzband/django-silk/issues/14)
**Merged pull requests:**
- Added tests for \_should\_intercept and fixed bug with requests not being ... [\#28](https://github.com/jazzband/django-silk/pull/28) ([mackeian](https://github.com/mackeian))
- Added missing requirement for running tests: mock [\#27](https://github.com/jazzband/django-silk/pull/27) ([mackeian](https://github.com/mackeian))
## [0.3.1](https://github.com/jazzband/django-silk/tree/0.3.1) (2014-07-05)
[Full Changelog](https://github.com/jazzband/django-silk/compare/0.3...0.3.1)
**Implemented enhancements:**
- Conform to charset flag in Content-Type header of request/response [\#20](https://github.com/jazzband/django-silk/issues/20)
- Enhance filtering [\#17](https://github.com/jazzband/django-silk/issues/17)
**Fixed bugs:**
- Conform to charset flag in Content-Type header of request/response [\#20](https://github.com/jazzband/django-silk/issues/20)
- HttpRequest body has UTF-8 Character causes UnicodeDecodeError ? [\#19](https://github.com/jazzband/django-silk/issues/19)
**Closed issues:**
- Problems with `six.moves.urllib` [\#22](https://github.com/jazzband/django-silk/issues/22)
- Incorrect string value: '\xCE\xBB, \xCF\x86...' for column 'raw\_body' at row 1 [\#21](https://github.com/jazzband/django-silk/issues/21)
- Silk fails on binary staticfiles content [\#16](https://github.com/jazzband/django-silk/issues/16)
- Silk's static assets are served from the wrong path [\#11](https://github.com/jazzband/django-silk/issues/11)
## [0.3](https://github.com/jazzband/django-silk/tree/0.3) (2014-06-17)
[Full Changelog](https://github.com/jazzband/django-silk/compare/V0.2.2...0.3)
## [V0.2.2](https://github.com/jazzband/django-silk/tree/V0.2.2) (2014-06-13)
[Full Changelog](https://github.com/jazzband/django-silk/compare/v0.2.2...V0.2.2)
## [v0.2.2](https://github.com/jazzband/django-silk/tree/v0.2.2) (2014-06-13)
[Full Changelog](https://github.com/jazzband/django-silk/compare/v0.2...v0.2.2)
**Closed issues:**
- request: timestamp on list of requests [\#15](https://github.com/jazzband/django-silk/issues/15)
- AttributeError: 'thread.\_local' object has no attribute 'temp\_identifier' [\#12](https://github.com/jazzband/django-silk/issues/12)
## [v0.2](https://github.com/jazzband/django-silk/tree/v0.2) (2014-06-12)
[Full Changelog](https://github.com/jazzband/django-silk/compare/v0.1.1...v0.2)
**Fixed bugs:**
- Stacktrace inspector allows users to see any file on the filesystem [\#10](https://github.com/jazzband/django-silk/issues/10)
## [v0.1.1](https://github.com/jazzband/django-silk/tree/v0.1.1) (2014-06-07)
[Full Changelog](https://github.com/jazzband/django-silk/compare/v0.1...v0.1.1)
**Closed issues:**
- Pip install direct from repo fails [\#9](https://github.com/jazzband/django-silk/issues/9)
- urls.py uses incorrect regex expressions [\#7](https://github.com/jazzband/django-silk/issues/7)
- requirements.txt must specify exact versions or version upper bounds [\#6](https://github.com/jazzband/django-silk/issues/6)
- Switch to PyPI for managing releases [\#4](https://github.com/jazzband/django-silk/issues/4)
**Merged pull requests:**
- Ensure README file is properly closed by setup.py [\#8](https://github.com/jazzband/django-silk/pull/8) ([svisser](https://github.com/svisser))
- updated readme [\#5](https://github.com/jazzband/django-silk/pull/5) ([rosscdh](https://github.com/rosscdh))
## [v0.1](https://github.com/jazzband/django-silk/tree/v0.1) (2014-06-06)
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*⏎
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct
As contributors and maintainers of the Jazzband projects, and in the interest of
fostering an open and welcoming community, we pledge to respect all people who
contribute through reporting issues, posting feature requests, updating documentation,
submitting pull requests or patches, and other activities.
We are committed to making participation in the Jazzband a harassment-free experience
for everyone, regardless of the level of experience, gender, gender identity and
expression, sexual orientation, disability, personal appearance, body size, race,
ethnicity, age, religion, or nationality.
Examples of unacceptable behavior by participants include:
- The use of sexualized language or imagery
- Personal attacks
- Trolling or insulting/derogatory comments
- Public or private harassment
- Publishing other's private information, such as physical or electronic addresses,
without explicit permission
- Other unethical or unprofessional conduct
The Jazzband roadies have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are not
aligned to this Code of Conduct, or to ban temporarily or permanently any contributor
for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
By adopting this Code of Conduct, the roadies commit themselves to fairly and
consistently applying these principles to every aspect of managing the jazzband
projects. Roadies who do not follow or enforce the Code of Conduct may be permanently
removed from the Jazzband roadies.
This code of conduct applies both within project spaces and in public spaces when an
individual is representing the project or its community.
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by
contacting the roadies at `roadies@jazzband.co`. All complaints will be reviewed and
investigated and will result in a response that is deemed necessary and appropriate to
the circumstances. Roadies are obligated to maintain confidentiality with regard to the
reporter of an incident.
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version
1.3.0, available at [https://contributor-covenant.org/version/1/3/0/][version]
[homepage]: https://contributor-covenant.org
[version]: https://contributor-covenant.org/version/1/3/0/
================================================
FILE: CONTRIBUTING.md
================================================
[](https://jazzband.co/)
This is a [Jazzband](https://jazzband.co/) project. By contributing you agree to abide by the [Contributor Code of Conduct](https://jazzband.co/about/conduct) and follow the [guidelines](https://jazzband.co/about/guidelines).
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2014 Michael Ford
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: MANIFEST.in
================================================
include LICENSE
include README*
recursive-include silk/templates *
recursive-include silk/static *
recursive-include silk/code_generation *.py
recursive-include silk/profiling *.py
recursive-include silk/utils *.py
recursive-include silk/views *.py
recursive-include silk *.py
================================================
FILE: README.md
================================================
# Silk
[](https://github.com/jazzband/django-silk/actions)
[](https://codecov.io/gh/jazzband/django-silk)
[](https://pypi.python.org/pypi/django-silk)
[](https://pypi.python.org/pypi/django-silk)
[](https://pypi.python.org/pypi/django-silk)
[](https://jazzband.co/)
Silk is a live profiling and inspection tool for the Django framework. Silk intercepts and stores HTTP requests and database queries before presenting them in a user interface for further inspection:
<img src="https://raw.githubusercontent.com/jazzband/django-silk/master/screenshots/1.png" width="720px"/>
## Contents
* [Requirements](#requirements)
* [Installation](#installation)
* [Features](#features)
* [Configuration](#configuration)
* [Authentication/Authorisation](#authenticationauthorisation)
* [Request/Response bodies](#requestresponse-bodies)
* [Meta-Profiling](#meta-profiling)
* [Recording a fraction of requests](#recording-a-fraction-of-requests)
* [Limiting request/response data](#limiting-requestresponse-data)
* [Clearing logged data](#clearing-logged-data)
* [Contributing](#contributing)
* [Development Environment](#development-environment)
## Requirements
Silk has been tested with:
* Django: 4.2, 5.1, 5.2, 6.0
* Python: 3.10, 3.11, 3.12, 3.13, 3.14
## Installation
Via pip into a `virtualenv`:
```bash
pip install django-silk
```
To including optional formatting of python snippets:
```bash
pip install django-silk[formatting]
```
In `settings.py` add the following:
```python
MIDDLEWARE = [
...
'silk.middleware.SilkyMiddleware',
...
]
TEMPLATES = [{
...
'OPTIONS': {
'context_processors': [
...
'django.template.context_processors.request',
],
},
}]
INSTALLED_APPS = (
...
'silk'
)
```
**Note:** The order of middleware is sensitive. If any middleware placed before `silk.middleware.SilkyMiddleware` returns a response without invoking its `get_response`, the `SilkyMiddleware` won’t run. To avoid this, ensure that middleware preceding `SilkyMiddleware` does not bypass or return a response without calling its `get_response`. For further details, check out the [Django documentation](https://docs.djangoproject.com/en/dev/topics/http/middleware/#middleware-order-and-layering).
**Note:** If you are using `django.middleware.gzip.GZipMiddleware`, place that **before** `silk.middleware.SilkyMiddleware`, otherwise you will get an encoding error.
If you want to use custom middleware, for example you developed the subclass of `silk.middleware.SilkyMiddleware`, so you can use this combination of settings:
```python
# Specify the path where is the custom middleware placed
SILKY_MIDDLEWARE_CLASS = 'path.to.your.middleware.MyCustomSilkyMiddleware'
# Use this variable in list of middleware
MIDDLEWARE = [
...
SILKY_MIDDLEWARE_CLASS,
...
]
```
To enable access to the user interface add the following to your `urls.py`:
```python
urlpatterns += [path('silk/', include('silk.urls', namespace='silk'))]
```
before running migrate:
```bash
python manage.py migrate
python manage.py collectstatic
```
Silk will automatically begin interception of requests and you can proceed to add profiling
if required. The UI can be reached at `/silk/`
### Alternative Installation
Via [github tags](https://github.com/jazzband/django-silk/releases):
```bash
pip install git+https://github.com/jazzband/django-silk.git@<version>#egg=django_silk
```
You can install from master using the following, but please be aware that the version in master
may not be working for all versions specified in [requirements](#requirements)
```bash
pip install -e git+https://github.com/jazzband/django-silk.git#egg=django_silk
```
## Features
Silk primarily consists of:
* Middleware for intercepting Requests/Responses
* A wrapper around SQL execution for profiling of database queries
* A context manager/decorator for profiling blocks of code and functions either manually or dynamically.
* A user interface for inspection and visualisation of the above.
### Request Inspection
The Silk middleware intercepts and stores requests and responses in the configured database.
These requests can then be filtered and inspecting using Silk's UI through the request overview:
<img src="https://raw.githubusercontent.com/jazzband/django-silk/master/screenshots/1.png" width="720px"/>
It records things like:
* Time taken
* Num. queries
* Time spent on queries
* Request/Response headers
* Request/Response bodies
and so on.
Further details on each request are also available by clicking the relevant request:
<img src="https://raw.githubusercontent.com/jazzband/django-silk/master/screenshots/2.png" width="720px"/>
### SQL Inspection
Silk also intercepts SQL queries that are generated by each request. We can get a summary on things like
the tables involved, number of joins and execution time (the table can be sorted by clicking on a column header):
<img src="https://raw.githubusercontent.com/jazzband/django-silk/master/screenshots/3.png" width="720px"/>
Before diving into the stack trace to figure out where this request is coming from:
<img src="https://raw.githubusercontent.com/jazzband/django-silk/master/screenshots/5.png" width="720px"/>
### Profiling
Turn on the SILKY_PYTHON_PROFILER setting to use Python's built-in `cProfile` profiler. Each request will be separately profiled and the profiler's output will be available on the request's Profiling page in the Silk UI. Note that as of Python 3.12, `cProfile` cannot run concurrently so [django-silk under Python 3.12 and later will not profile if another profile is running](https://github.com/jazzband/django-silk/pull/692) (even its own profiler in another thread).
```python
SILKY_PYTHON_PROFILER = True
```
If you would like to also generate a binary `.prof` file set the following:
```python
SILKY_PYTHON_PROFILER_BINARY = True
```
When enabled, a graph visualisation generated using [gprof2dot](https://github.com/jrfonseca/gprof2dot) and [viz.js](https://github.com/almende/vis) is shown in the profile detail page:
<img src="https://raw.githubusercontent.com/jazzband/django-silk/master/screenshots/10.png" width="720px"/>
A custom storage class can be used for the saved generated binary `.prof` files:
```python
# For Django >= 4.2 and Django-Silk >= 5.1.0:
# See https://docs.djangoproject.com/en/5.0/ref/settings/#std-setting-STORAGES
STORAGES = {
'SILKY_STORAGE': {
'BACKEND': 'path.to.StorageClass',
},
# ...
}
# For Django < 4.2 or Django-Silk < 5.1.0
SILKY_STORAGE_CLASS = 'path.to.StorageClass'
```
The default storage class is `silk.storage.ProfilerResultStorage`, and when using that you can specify a path of your choosing. You must ensure the specified directory exists.
```python
# If this is not set, MEDIA_ROOT will be used.
SILKY_PYTHON_PROFILER_RESULT_PATH = '/path/to/profiles/'
```
A download button will become available with a binary `.prof` file for every request. This file can be used for further analysis using [snakeviz](https://github.com/jiffyclub/snakeviz) or other cProfile tools
To retrieve which endpoint generates a specific profile file it is possible to add a stub of the request path in the file name with the following:
```python
SILKY_PYTHON_PROFILER_EXTENDED_FILE_NAME = True
```
Silk can also be used to profile specific blocks of code/functions. It provides a decorator and a context
manager for this purpose.
For example:
```python
from silk.profiling.profiler import silk_profile
@silk_profile(name='View Blog Post')
def post(request, post_id):
p = Post.objects.get(pk=post_id)
return render(request, 'post.html', {
'post': p
})
```
Whenever a blog post is viewed we get an entry within the Silk UI:
<img src="https://raw.githubusercontent.com/jazzband/django-silk/master/screenshots/7.png" width="720px"/>
Silk profiling not only provides execution time, but also collects SQL queries executed within the block in the same fashion as with requests:
<img src="https://raw.githubusercontent.com/jazzband/django-silk/master/screenshots/8.png" width="720px"/>
#### Decorator
The silk decorator can be applied to both functions and methods
```python
from silk.profiling.profiler import silk_profile
# Profile a view function
@silk_profile(name='View Blog Post')
def post(request, post_id):
p = Post.objects.get(pk=post_id)
return render(request, 'post.html', {
'post': p
})
# Profile a method in a view class
class MyView(View):
@silk_profile(name='View Blog Post')
def get(self, request):
p = Post.objects.get(pk=post_id)
return render(request, 'post.html', {
'post': p
})
```
#### Context Manager
Using a context manager means we can add additional context to the name which can be useful for
narrowing down slowness to particular database records.
```python
def post(request, post_id):
with silk_profile(name='View Blog Post #%d' % self.pk):
p = Post.objects.get(pk=post_id)
return render(request, 'post.html', {
'post': p
})
```
#### Dynamic Profiling
One of Silk's more interesting features is dynamic profiling. If for example we wanted to profile a function in a dependency to which we only have read-only access (e.g. system python libraries owned by root) we can add the following to `settings.py` to apply a decorator at runtime:
```python
SILKY_DYNAMIC_PROFILING = [{
'module': 'path.to.module',
'function': 'MyClass.bar'
}]
```
which is roughly equivalent to:
```python
class MyClass:
@silk_profile()
def bar(self):
pass
```
The below summarizes the possibilities:
```python
"""
Dynamic function decorator
"""
SILKY_DYNAMIC_PROFILING = [{
'module': 'path.to.module',
'function': 'foo'
}]
# ... is roughly equivalent to
@silk_profile()
def foo():
pass
"""
Dynamic method decorator
"""
SILKY_DYNAMIC_PROFILING = [{
'module': 'path.to.module',
'function': 'MyClass.bar'
}]
# ... is roughly equivalent to
class MyClass:
@silk_profile()
def bar(self):
pass
"""
Dynamic code block profiling
"""
SILKY_DYNAMIC_PROFILING = [{
'module': 'path.to.module',
'function': 'foo',
# Line numbers are relative to the function as opposed to the file in which it resides
'start_line': 1,
'end_line': 2,
'name': 'Slow Foo'
}]
# ... is roughly equivalent to
def foo():
with silk_profile(name='Slow Foo'):
print (1)
print (2)
print(3)
print(4)
```
Note that dynamic profiling behaves in a similar fashion to that of the python mock framework in that
we modify the function in-place e.g:
```python
""" my.module """
from another.module import foo
# ...do some stuff
foo()
# ...do some other stuff
```
,we would profile `foo` by dynamically decorating `my.module.foo` as opposed to `another.module.foo`:
```python
SILKY_DYNAMIC_PROFILING = [{
'module': 'my.module',
'function': 'foo'
}]
```
If we were to apply the dynamic profile to the functions source module `another.module.foo` **after**
it has already been imported, no profiling would be triggered.
#### Custom Logic for Profiling
Sometimes you may want to dynamically control when the profiler runs. You can write your own logic for when to enable the profiler. To do this add the following to your `settings.py`:
This setting is mutually exclusive with SILKY_PYTHON_PROFILER and will be used over it if present. It will work with SILKY_DYNAMIC_PROFILING.
```python
def my_custom_logic(request):
return 'profile_requests' in request.session
SILKY_PYTHON_PROFILER_FUNC = my_custom_logic # profile only session has recording enabled.
```
You can also use a `lambda`.
```python
# profile only session has recording enabled.
SILKY_PYTHON_PROFILER_FUNC = lambda request: 'profile_requests' in request.session
```
### Code Generation
Silk currently generates two bits of code per request:
<img src="https://raw.githubusercontent.com/jazzband/django-silk/master/screenshots/9.png" width="720px"/>
Both are intended for use in replaying the request. The curl command can be used to replay via command-line and the python code can be used within a Django unit test or simply as a standalone script.
## Configuration
### Authentication/Authorisation
By default anybody can access the Silk user interface by heading to `/silk/`. To enable your Django
auth backend place the following in `settings.py`:
```python
SILKY_AUTHENTICATION = True # User must login
SILKY_AUTHORISATION = True # User must have permissions
```
If `SILKY_AUTHORISATION` is `True`, by default Silk will only authorise users with `is_staff` attribute set to `True`.
You can customise this using the following in `settings.py`:
```python
def my_custom_perms(user):
return user.is_allowed_to_use_silk
SILKY_PERMISSIONS = my_custom_perms
```
You can also use a `lambda`.
```python
SILKY_PERMISSIONS = lambda user: user.is_superuser
```
### Request/Response bodies
By default, Silk will save down the request and response bodies for each request for future viewing
no matter how large. If Silk is used in production under heavy volume with large bodies this can have
a huge impact on space/time performance. This behaviour can be configured with the following options:
```python
SILKY_MAX_REQUEST_BODY_SIZE = -1 # Silk takes anything <0 as no limit
SILKY_MAX_RESPONSE_BODY_SIZE = 1024 # If response body>1024 bytes, ignore
```
### Meta-Profiling
Sometimes it is useful to be able to see what effect Silk is having on the request/response time. To do this add
the following to your `settings.py`:
```python
SILKY_META = True
```
Silk will then record how long it takes to save everything down to the database at the end of each
request:
<img src="https://raw.githubusercontent.com/jazzband/django-silk/master/screenshots/meta.png"/>
Note that in the above screenshot, this means that the request took 29ms (22ms from Django and 7ms from Silk)
### Recording a Fraction of Requests
On high-load sites it may be helpful to only record a fraction of the requests that are made. To do this add the following to your `settings.py`:
Note: This setting is mutually exclusive with SILKY_INTERCEPT_FUNC.
```python
SILKY_INTERCEPT_PERCENT = 50 # log only 50% of requests
```
#### Custom Logic for Recording Requests
On high-load sites it may also be helpful to write your own logic for when to intercept requests. To do this add the following to your `settings.py`:
Note: This setting is mutually exclusive with SILKY_INTERCEPT_PERCENT.
```python
def my_custom_logic(request):
return 'record_requests' in request.session
SILKY_INTERCEPT_FUNC = my_custom_logic # log only session has recording enabled.
```
You can also use a `lambda`.
```python
# log only session has recording enabled.
SILKY_INTERCEPT_FUNC = lambda request: 'record_requests' in request.session
```
### Limiting request/response data
To make sure silky garbage collects old request/response data, a config var can be set to limit the number of request/response rows it stores.
```python
SILKY_MAX_RECORDED_REQUESTS = 10**4
```
The garbage collection is only run on a percentage of requests to reduce overhead. It can be adjusted with this config:
```python
SILKY_MAX_RECORDED_REQUESTS_CHECK_PERCENT = 10
```
In case you want decouple silk's garbage collection from your webserver's request processing, set SILKY_MAX_RECORDED_REQUESTS_CHECK_PERCENT=0 and trigger it manually, e.g. in a cron job:
```bash
python manage.py silk_request_garbage_collect
```
### Enable query analysis
To enable query analysis when supported by the dbms a config var can be set in order to execute queries with the analyze features.
```python
SILKY_ANALYZE_QUERIES = True
```
**Warning:** This setting may cause the database to execute the same query twice, depending on the backend. For instance, `EXPLAIN ANALYZE` in Postgres will [actually execute the query](https://www.postgresql.org/docs/current/sql-explain.html), which may result in unexpected data updates. Set this to True with caution.
To pass additional params for profiling when supported by the dbms (e.g. VERBOSE, FORMAT JSON), you can do this in the following manner.
```python
SILKY_EXPLAIN_FLAGS = {'format':'JSON', 'costs': True}
```
### Masking sensitive data on request body
By default, Silk is filtering values that contains the following keys (they are case insensitive)
```python
SILKY_SENSITIVE_KEYS = {'username', 'api', 'token', 'key', 'secret', 'password', 'signature'}
```
But sometimes, you might want to have your own sensitive keywords, then above configuration can be modified
```python
SILKY_SENSITIVE_KEYS = {'custom-password'}
```
### Clearing logged data
A management command will wipe out all logged data:
```bash
python manage.py silk_clear_request_log
```
## Contributing
[](https://jazzband.co/)
This is a [Jazzband](https://jazzband.co/) project. By contributing you agree to abide by the [Contributor Code of Conduct](https://jazzband.co/about/conduct) and follow the [guidelines](https://jazzband.co/about/guidelines).
### Development Environment
Silk features a project named `project` that can be used for `silk` development. It has the `silk` code symlinked so
you can work on the sample `project` and on the `silk` package at the same time.
In order to setup local development you should first install all the dependencies for the test `project`. From the
root of the `project` directory:
```bash
pip install -r requirements.txt
```
You will also need to install `silk`'s dependencies. From the root of the git repository:
```bash
pip install -e .
```
At this point your virtual environment should have everything it needs to run both the sample `project` and
`silk` successfully.
Before running, you must set the `DB_ENGINE` and `DB_NAME` environment variables:
```bash
export DB_ENGINE=sqlite3
export DB_NAME=db.sqlite3
```
For other combinations, check [`tox.ini`](./tox.ini).
Now from the root of the sample `project` apply the migrations
```bash
python manage.py migrate
```
Now from the root of the sample `project` directory start the django server
```bash
python manage.py runserver
```
#### Running the tests
```bash
cd project
python manage.py test
```
Happy profiling!
================================================
FILE: docs/Makefile
================================================
# Makefile for Sphinx documentation
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/silk.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/silk.qhc"
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/silk"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/silk"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
================================================
FILE: docs/conf.py
================================================
#
# silk documentation build configuration file, created by
# sphinx-quickstart on Sun Jun 22 13:51:12 2014.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import pkg_resources
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = []
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.rst'
# The encoding of source files.
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = 'silk'
copyright = '2014, Michael Ford'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The full version, including alpha/beta/rc tags.
release = pkg_resources.get_distribution("django-silk").version
# The short X.Y version.
version = '.'.join(release.split('.')[:2])
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
# language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
# today = ''
# Else, today_fmt is used as the format for a strftime call.
# today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all
# documents.
# default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
# add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
# add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
# show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
# modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
# keep_warnings = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'default'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
# html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
# html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
# html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
# html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
# html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
# html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
# html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
# html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
# html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
# html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
# html_additional_pages = {}
# If false, no module index is generated.
# html_domain_indices = True
# If false, no index is generated.
# html_use_index = True
# If true, the index is split into individual pages for each letter.
# html_split_index = False
# If true, links to the reST sources are added to the pages.
# html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
# html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
# html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
# html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
# html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = 'silkdoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
# 'preamble': '',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
('index', 'silk.tex', 'silk Documentation',
'Michael Ford', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
# latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
# latex_use_parts = False
# If true, show page references after internal links.
# latex_show_pagerefs = False
# If true, show URL addresses after external links.
# latex_show_urls = False
# Documents to append as an appendix to all manuals.
# latex_appendices = []
# If false, no module index is generated.
# latex_domain_indices = True
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'silk', 'silk Documentation',
['Michael Ford'], 1),
('profiling', 'Profiling', 'Profiling',
['Michael Ford'], 2),
]
# If true, show URL addresses after external links.
# man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
('index', 'silk', 'silk Documentation',
'Michael Ford', 'silk', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
# texinfo_appendices = []
# If false, no module index is generated.
# texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
# texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
# texinfo_no_detailmenu = False
================================================
FILE: docs/configuration.rst
================================================
Configuration
=============
Authentication and Authorisation
--------------------------------
By default anybody can access the Silk user interface by heading to `/silk/`. To enable your Django
auth backend place the following in `settings.py`:
.. code-block:: python
SILKY_AUTHENTICATION = True # User must login
SILKY_AUTHORISATION = True # User must have permissions
If ``SILKY_AUTHORISATION`` is ``True``, by default Silk will only authorise users with ``is_staff`` attribute set to ``True``.
You can customise this using the following in ``settings.py``:
.. code-block:: python
def my_custom_perms(user):
return user.is_allowed_to_use_silk
SILKY_PERMISSIONS = my_custom_perms
Request and Response bodies
---------------------------
By default, Silk will save down the request and response bodies for each request for future viewing
no matter how large. If Silk is used in production under heavy volume with large bodies this can have
a huge impact on space/time performance. This behaviour can be configured with following options:
.. code-block:: python
SILKY_MAX_REQUEST_BODY_SIZE = -1 # Silk takes anything <0 as no limit
SILKY_MAX_RESPONSE_BODY_SIZE = 1024 # If response body>1024kb, ignore
Meta-Profiling
--------------
Sometimes its useful to be able to see what effect Silk is having on the request/response time. To do this add
the following to your `settings.py`:
.. code-block:: python
SILKY_META = True
Silk will then record how long it takes to save everything down to the database at the end of each request:
.. image:: /images/meta.png
Note that in the above screenshot, this means that the request took 29ms (22ms from Django and 7ms from Silk)
Limiting request and response data
----------------------------------
To make sure silky garbage collects old request/response data, a config var can be set to limit the number of request/response rows it stores.
.. code-block:: python
SILKY_MAX_RECORDED_REQUESTS = 10**4
The garbage collection is only run on a percentage of requests to reduce overhead. It can be adjusted with this config:
.. code-block:: python
SILKY_MAX_RECORDED_REQUESTS_CHECK_PERCENT = 10
================================================
FILE: docs/index.rst
================================================
.. silk documentation master file, created by
sphinx-quickstart on Sun Jun 22 13:51:12 2014.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Silk
================================
.. toctree::
:maxdepth: 2
quickstart
profiling
configuration
troubleshooting
Silk is a live profiling and inspection tool for the Django framework. Silk intercepts and stores HTTP requests and database queries before presenting them in a user interface for further inspection:
.. image:: /images/1.png
A **live demo** is available `here`_.
.. _here: http://mtford.co.uk/silk/
Features
--------
- Inspect HTTP requests and responses
- Query parameters
- Headers
- Bodies
- Execution Time
- Database Queries
- Number
- Time taken
- SQL query inspection
- Profiling of arbitrary code blocks via a Python context manager and decorator
- Execution Time
- Database Queries
- Can also be injected dynamically at runtime e.g. if read-only dependency.
- Authentication/Authorisation for production use
Requirements
------------
* Django: 4.2, 5.1, 5.2, 6.0
* Python: 3.10, 3.11, 3.12, 3.13, 3.14
================================================
FILE: docs/profiling.rst
================================================
Profiling
=========
Silk can be used to profile arbitrary blocks of code and provides ``silk_profile``, a Python decorator and a context manager for this purpose. Profiles will then appear in the 'Profiling' tab within Silk's user interface.
Decorator
---------
The decorator can be applied to both functions and methods:
.. code-block:: python
@silk_profile(name='View Blog Post')
def post(request, post_id):
p = Post.objects.get(pk=post_id)
return render(request, 'post.html', {
'post': p
})
.. code-block:: python
class MyView(View):
@silk_profile(name='View Blog Post')
def get(self, request):
p = Post.objects.get(pk=post_id)
return render(request, 'post.html', {
'post': p
})
Context Manager
---------------
``silk_profile`` can also be used as a context manager:
.. code-block:: python
def post(request, post_id):
with silk_profile(name='View Blog Post #%d' % self.pk):
p = Post.objects.get(pk=post_id)
return render(request, 'post.html', {
'post': p
})
Dynamic Profiling
-----------------
Decorators and context managers can also be injected at run-time. This is useful if we want to narrow down slow requests/database queries to dependencies.
Dynamic profiling is configured via the ``SILKY_DYNAMIC_PROFILING`` option in your ``settings.py``:
.. code-block:: python
"""
Dynamic function decorator
"""
SILKY_DYNAMIC_PROFILING = [{
'module': 'path.to.module',
'function': 'foo'
}]
# ... is roughly equivalent to
@silk_profile()
def foo():
pass
"""
Dynamic method decorator
"""
SILKY_DYNAMIC_PROFILING = [{
'module': 'path.to.module',
'function': 'MyClass.bar'
}]
# ... is roughly equivalent to
class MyClass:
@silk_profile()
def bar(self):
pass
"""
Dynamic code block profiling
"""
SILKY_DYNAMIC_PROFILING = [{
'module': 'path.to.module',
'function': 'foo',
# Line numbers are relative to the function as opposed to the file in which it resides
'start_line': 1,
'end_line': 2,
'name': 'Slow Foo'
}]
# ... is roughly equivalent to
def foo():
with silk_profile(name='Slow Foo'):
print (1)
print (2)
print(3)
print(4)
Note that dynamic profiling behaves in a similar fashion to that of the python mock framework in that
we modify the function in-place e.g:
.. code-block:: python
""" my.module """
from another.module import foo
# ...do some stuff
foo()
# ...do some other stuff
We would profile ``foo`` by dynamically decorating `my.module.foo` as opposed to ``another.module.foo``:
.. code-block:: python
SILKY_DYNAMIC_PROFILING = [{
'module': 'my.module',
'function': 'foo'
}]
If we were to apply the dynamic profile to the functions source module ``another.module.foo`` *after* it has already been imported, no profiling would be triggered.
================================================
FILE: docs/quickstart.rst
================================================
Quick Start
===========
Silk is installed like any other Django app.
First install via pip:
.. code-block:: bash
pip install django-silk
Add the following to your ``settings.py``:
.. code-block:: python
MIDDLEWARE = [
...
'silk.middleware.SilkyMiddleware',
...
]
TEMPLATES = [{
...
'OPTIONS': {
'context_processors': [
...
'django.template.context_processors.request',
],
},
}]
INSTALLED_APPS = [
...
'silk.apps.SilkAppConfig'
]
Add the following to your ``urls.py``:
.. code-block:: python
urlpatterns += [path('silk', include('silk.urls', namespace='silk'))]
Run ``migrate`` to create Silk's database tables:
.. code-block:: bash
python manage.py migrate
And voila! Silk will begin intercepting requests and queries which you can inspect by visiting ``/silk/``
Python Snippet Formatting
-------------------------
Silk supports generating Python snippets to reproduce requests.
To enable autopep8 formatting of these snippets, install Silk with the `formatting` extras:
.. code-block:: bash
pip install django-silk[formatting]
Other Installation Options
--------------------------
You can download a release from `github <https://github.com/jazzband/django-silk/releases>`_ and then install using pip:
.. code-block:: bash
pip install django-silk-<version>.tar.gz
You can also install directly from the github repo but please note that this version is not guaranteed to be working:
.. code-block:: bash
pip install -e git+https://github.com/jazzband/django-silk.git#egg=django_silk
================================================
FILE: docs/troubleshooting.rst
================================================
Troubleshooting
===============
The below details common problems when using Silk, most of which have been derived from the solutions to github issues.
Unicode
-------
Silk saves down the request and response bodies of each HTTP request by default. These bodies are often UTF encoded and hence it is important that Silk's database tables are also UTF encoded. Django has no facility for enforcing this and instead assumes that the configured database defaults to UTF.
If you see errors like:
Incorrect string value: '\xCE\xBB, \xCF\x86...' for column 'raw_body' at row...
Then it's likely your database is not configured correctly for UTF encoding.
See this `github issue <https://github.com/jazzband/django-silk/issues/21>`_ for more details and workarounds.
Context Processor
-----------------
Silk requires the template context to include a ``request`` object in order to save and analyze it.
If you see errors like:
.. code-block:: text
File "/service/venv/lib/python3.12/site-packages/silk/templatetags/silk_nav.py", line 9, in navactive
path = request.path
^^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'path'
Include ``django.template.context_processors.request`` in your Django settings' ``TEMPLATES`` context processors as `recommended <https://github.com/jazzband/django-silk/issues/805>`_.
Middleware
----------
The order of middleware is sensitive. If any middleware placed before ``silk.middleware.SilkyMiddleware`` returns a response without invoking its ``get_response``, the ``SilkyMiddleware`` won’t run. To avoid this, ensure that middleware preceding ``SilkyMiddleware`` does not bypass or return a response without calling its ``get_response``. For further details, check out the `Django documentation <https://docs.djangoproject.com/en/dev/topics/http/middleware/#middleware-order-and-layering>`.
Garbage Collection
------------------
To `avoid <https://github.com/jazzband/django-silk/issues/265>`_ `deadlock <https://github.com/jazzband/django-silk/issues/294>`_ `issues <https://github.com/jazzband/django-silk/issues/371>`_, you might want to decouple silk's garbage collection from your webserver's request processing, set ``SILKY_MAX_RECORDED_REQUESTS_CHECK_PERCENT=0`` and trigger it manually, e.g. in a cron job:
.. code-block:: bash
python manage.py silk_request_garbage_collect
================================================
FILE: gulpfile.js
================================================
let gulp = require('gulp'),
sass = require('gulp-sass');
gulp.task('watch', function () {
gulp.watch('scss/**/*.scss', gulp.series('sass'));
});
gulp.task('sass', function () {
return gulp.src('scss/**/*.scss')
.pipe(sass().on('error', sass.logError))
.pipe(gulp.dest('silk/static/silk/css'));
});
================================================
FILE: package.json
================================================
{
"name": "silk",
"version": "5.5.0",
"description": "https://github.com/jazzband/django-silk",
"main": "index.js",
"directories": {
"doc": "docs",
"test": "tests"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "https://github.com/jazzband/django-silk.git"
},
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/jazzband/django-silk/issues"
},
"homepage": "https://github.com/jazzband/django-silk",
"devDependencies": {
"gulp": "^4.0.2",
"gulp-sass": "^4.0.2"
},
"dependencies": {}
}
================================================
FILE: project/example_app/__init__.py
================================================
================================================
FILE: project/example_app/admin.py
================================================
from django.contrib import admin
from django.urls import reverse
from .models import Blind
@admin.register(Blind)
class BlindAdmin(admin.ModelAdmin):
list_display = ('desc', 'thumbnail', 'name', 'child_safe')
list_editable = ('name', 'child_safe')
@admin.display(
description='Photo'
)
def thumbnail(self, obj):
try:
img_tag = '<img src="%s" width="200px"/>' % obj.photo.url
except ValueError:
return ''
url = self._blind_url(obj)
return f'<a href="{url}">{img_tag}</a>'
def _blind_url(self, obj):
url = reverse('admin:example_app_blind_change', args=(obj.id, ))
return url
@admin.display(
description='Blind'
)
def desc(self, obj):
desc = str(obj)
url = self._blind_url(obj)
return f'<a href="{url}">{desc}</a>'
================================================
FILE: project/example_app/migrations/0001_initial.py
================================================
# Generated by Django 1.9.7 on 2016-07-08 13:19
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Blind',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('photo', models.ImageField(upload_to=b'products')),
('name', models.TextField()),
('child_safe', models.BooleanField(default=False)),
],
options={
'abstract': False,
},
),
]
================================================
FILE: project/example_app/migrations/0002_alter_blind_photo.py
================================================
# Generated by Django 3.2 on 2021-04-12 22:45
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('example_app', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='blind',
name='photo',
field=models.ImageField(upload_to='products'),
),
]
================================================
FILE: project/example_app/migrations/0003_blind_unique_name_if_provided.py
================================================
# Generated by Django 3.2.16 on 2022-10-28 08:08
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('example_app', '0002_alter_blind_photo'),
]
operations = [
migrations.AddConstraint(
model_name='blind',
constraint=models.UniqueConstraint(condition=models.Q(('name', ''), _negated=True), fields=('name',), name='unique_name_if_provided'),
),
]
================================================
FILE: project/example_app/migrations/__init__.py
================================================
================================================
FILE: project/example_app/models.py
================================================
from django.db import models
# Create your models here.
from django.db.models import BooleanField, ImageField, TextField
class Product(models.Model):
photo = ImageField(upload_to='products')
class Meta:
abstract = True
class Blind(Product):
name = TextField()
child_safe = BooleanField(default=False)
def __str__(self):
return self.name
class Meta:
constraints = [
models.UniqueConstraint(
fields=["name"],
condition=~models.Q(name=""),
name="unique_name_if_provided",
),
]
================================================
FILE: project/example_app/templates/example_app/blind_form.html
================================================
<html>
<body>
<h1>Example App</h1>
<p>Use this app for testing and playing around with Silk. Displays a Blind creation form.</p>
<form method="post" action="">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Save</button>
</form>
</body>
</html>
================================================
FILE: project/example_app/templates/example_app/index.html
================================================
<html>
<head>
<style>
.blind {
max-width: 200px
}
</style>
</head>
<body>
<h1>Example App</h1>
<p>Use this app for testing and playing around with Silk. Displays a range of Blinds. Use admin to add them.</p>
<table>
<tr>
<th>Photo</th>
<th>Name</th>
<th>Child safe?</th>
</tr>
{% for blind in blinds %}
<tr>
<td>{% if blind.photo %}<img class="blind" src="{{ blind.photo.url }}">{% endif %}</td>
<td>{{ blind.name }}</td>
<td>{% if blind.child_safe %}Yes{% else %}No{% endif %}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
================================================
FILE: project/example_app/templates/example_app/login.html
================================================
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}
<form method="post" action="{% url 'django.contrib.auth.views.login' %}">
{% csrf_token %}
<table>
<tr>
<td>{{ form.username.label_tag }}</td>
<td>{{ form.username }}</td>
</tr>
<tr>
<td>{{ form.password.label_tag }}</td>
<td>{{ form.password }}</td>
</tr>
</table>
<input type="submit" value="login"/>
<input type="hidden" name="next" value="{{ next }}"/>
</form>
</body>
</html>
================================================
FILE: project/example_app/tests.py
================================================
# Create your tests here.
================================================
FILE: project/example_app/urls.py
================================================
from django.urls import path
from . import views
app_name = 'example_app'
urlpatterns = [
path(route='', view=views.index, name='index'),
path(route='create', view=views.ExampleCreateView.as_view(), name='create'),
]
================================================
FILE: project/example_app/views.py
================================================
from time import sleep
# Create your views here.
from django.shortcuts import render
from django.urls import reverse_lazy
from django.views.generic import CreateView
from example_app import models
from silk.profiling.profiler import silk_profile
def index(request):
@silk_profile()
def do_something_long():
sleep(1.345)
with silk_profile(name='Why do this take so long?'):
do_something_long()
return render(request, 'example_app/index.html', {'blinds': models.Blind.objects.all()})
class ExampleCreateView(CreateView):
model = models.Blind
fields = ['name']
success_url = reverse_lazy('example_app:index')
================================================
FILE: project/manage.py
================================================
#!/usr/bin/env python
"""Define the Django Silk management entry."""
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
================================================
FILE: project/project/__init__.py
================================================
__author__ = 'mtford'
================================================
FILE: project/project/settings.py
================================================
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
SECRET_KEY = 'ey5!m&h-uj6c7dzp@(o1%96okkq4!&bjja%oi*v3r=2t(!$7os'
DEBUG = True
DEBUG_PROPAGATE_EXCEPTIONS = True
ALLOWED_HOSTS = []
INSTALLED_APPS = (
'django.contrib.staticfiles',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.messages',
'django.contrib.sessions',
'silk',
'example_app'
)
ROOT_URLCONF = 'project.urls'
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'silk.middleware.SilkyMiddleware'
]
WSGI_APPLICATION = 'wsgi.application'
DB_ENGINE = os.environ.get("DB_ENGINE", "postgresql")
DATABASES = {
"default": {
"ENGINE": f"django.db.backends.{DB_ENGINE}",
"NAME": os.environ.get("DB_NAME", "postgres"),
"USER": os.environ.get("DB_USER", 'postgres'),
"PASSWORD": os.environ.get("DB_PASSWORD", "postgres"),
"HOST": os.environ.get("DB_HOST", "127.0.0.1"),
"PORT": os.environ.get("DB_PORT", 5432),
"ATOMIC_REQUESTS": True
},
}
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True
LOGGING = {
'version': 1,
'formatters': {
'mosayc': {
'format': '%(asctime)-15s %(levelname)-7s %(message)s [%(funcName)s (%(filename)s:%(lineno)s)]',
}
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'mosayc'
}
},
'loggers': {
'silk': {
'handlers': ['console'],
'level': 'DEBUG'
}
},
}
STATIC_URL = '/static/'
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
TEMP_DIR = os.path.join(BASE_DIR, "tmp")
STATIC_ROOT = os.path.join(TEMP_DIR, "static")
if not os.path.exists(STATIC_ROOT):
os.makedirs(STATIC_ROOT)
MEDIA_ROOT = BASE_DIR + '/media/'
MEDIA_URL = '/media/'
if not os.path.exists(MEDIA_ROOT):
os.mkdir(MEDIA_ROOT)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.request',
],
},
},
]
LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/'
SILKY_META = True
SILKY_PYTHON_PROFILER = True
SILKY_PYTHON_PROFILER_BINARY = True
# Do not garbage collect for tests
SILKY_MAX_RECORDED_REQUESTS_CHECK_PERCENT = 0
# SILKY_AUTHENTICATION = True
# SILKY_AUTHORISATION = True
================================================
FILE: project/project/urls.py
================================================
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.contrib.auth import views
from django.urls import include, path
urlpatterns = [
path(
route='silk/',
view=include('silk.urls', namespace='silk'),
),
path(
route='example_app/',
view=include('example_app.urls', namespace='example_app'),
),
path(route='admin/', view=admin.site.urls),
]
urlpatterns += [
path(
route='login/',
view=views.LoginView.as_view(
template_name='example_app/login.html'
),
name='login',
),
]
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + \
static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
================================================
FILE: project/tests/__init__.py
================================================
from . import * # noqa: F401, F403
================================================
FILE: project/tests/data/__init__.py
================================================
__author__ = 'mtford'
================================================
FILE: project/tests/data/dynamic.py
================================================
def foo():
print('1')
print('2')
print('3')
def foo2():
print('1')
print('2')
print('3')
================================================
FILE: project/tests/factories.py
================================================
import factory
import factory.fuzzy
from example_app.models import Blind
from silk.models import Request, Response, SQLQuery
HTTP_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'HEAD', 'OPTIONS']
STATUS_CODES = [200, 201, 300, 301, 302, 401, 403, 404]
class SQLQueryFactory(factory.django.DjangoModelFactory):
query = factory.Sequence(lambda num: 'SELECT foo FROM bar WHERE foo=%s' % num)
traceback = factory.Sequence(lambda num: 'Traceback #%s' % num)
class Meta:
model = SQLQuery
class RequestMinFactory(factory.django.DjangoModelFactory):
path = factory.Faker('uri_path')
method = factory.fuzzy.FuzzyChoice(HTTP_METHODS)
class Meta:
model = Request
class ResponseFactory(factory.django.DjangoModelFactory):
request = factory.SubFactory(RequestMinFactory)
status_code = factory.fuzzy.FuzzyChoice(STATUS_CODES)
class Meta:
model = Response
class BlindFactory(factory.django.DjangoModelFactory):
name = factory.Faker('pystr', min_chars=5, max_chars=10)
child_safe = factory.Faker('pybool')
photo = factory.django.ImageField()
class Meta:
model = Blind
================================================
FILE: project/tests/test_app_config.py
================================================
from django.apps import apps as proj_apps
from django.test import TestCase
from silk.apps import SilkAppConfig
class TestAppConfig(TestCase):
"""
Test if correct AppConfig class is loaded by Django.
"""
def test_app_config_loaded(self):
silk_app_config = proj_apps.get_app_config("silk")
self.assertIsInstance(silk_app_config, SilkAppConfig)
================================================
FILE: project/tests/test_code.py
================================================
from collections import namedtuple
from django.test import TestCase
from silk.views.code import _code, _code_context, _code_context_from_request
FILE_PATH = __file__
LINE_NUM = 5
END_LINE_NUM = 10
with open(__file__) as f:
ACTUAL_LINES = [line + '\n' for line in f.read().split('\n')]
class CodeTestCase(TestCase):
def assertActualLineEqual(self, actual_line, end_line_num=None):
expected_actual_line = ACTUAL_LINES[LINE_NUM - 1:end_line_num or LINE_NUM]
self.assertEqual(actual_line, expected_actual_line)
def assertCodeEqual(self, code):
expected_code = [line.strip('\n') for line in ACTUAL_LINES[0:LINE_NUM + 10]] + ['']
self.assertEqual(code, expected_code)
def test_code(self):
for end_line_num in None, END_LINE_NUM:
actual_line, code = _code(FILE_PATH, LINE_NUM, end_line_num)
self.assertActualLineEqual(actual_line, end_line_num)
self.assertCodeEqual(code)
def test_code_context(self):
for end_line_num in None, END_LINE_NUM:
for prefix in '', 'salchicha_':
context = _code_context(FILE_PATH, LINE_NUM, end_line_num, prefix)
self.assertActualLineEqual(context[prefix + 'actual_line'], end_line_num)
self.assertCodeEqual(context[prefix + 'code'])
self.assertEqual(context[prefix + 'file_path'], FILE_PATH)
self.assertEqual(context[prefix + 'line_num'], LINE_NUM)
def test_code_context_from_request(self):
for end_line_num in None, END_LINE_NUM:
for prefix in '', 'salchicha_':
request = namedtuple('Request', 'GET')(dict(file_path=FILE_PATH, line_num=LINE_NUM))
context = _code_context_from_request(request, end_line_num, prefix)
self.assertActualLineEqual(context[prefix + 'actual_line'], end_line_num)
self.assertCodeEqual(context[prefix + 'code'])
self.assertEqual(context[prefix + 'file_path'], FILE_PATH)
self.assertEqual(context[prefix + 'line_num'], LINE_NUM)
================================================
FILE: project/tests/test_code_gen_curl.py
================================================
import shlex
from unittest import TestCase
from silk.code_generation.curl import curl_cmd
class TestCodeGenCurl(TestCase):
def test_post_json(self):
result = curl_cmd(
url="https://example.org/alpha/beta",
method="POST",
body={"gamma": "delta"},
content_type="application/json",
)
result_words = shlex.split(result)
self.assertEqual(result_words, [
'curl', '-X', 'POST',
'-H', 'content-type: application/json',
'-d', '{"gamma": "delta"}',
'https://example.org/alpha/beta'
])
================================================
FILE: project/tests/test_code_gen_django.py
================================================
import textwrap
from unittest import TestCase
from silk.code_generation.django_test_client import gen
class TestCodeGenDjango(TestCase):
def test_post(self):
result = gen(
path="/alpha/beta",
method="POST",
data={"gamma": "delta", "epsilon": "zeta"},
content_type="application/x-www-form-urlencoded",
)
self.assertEqual(result, textwrap.dedent("""\
from django.test import Client
c = Client()
response = c.post(path='/alpha/beta',
data={'gamma': 'delta', 'epsilon': 'zeta'},
content_type='application/x-www-form-urlencoded')
"""))
================================================
FILE: project/tests/test_collector.py
================================================
import cProfile
import os.path
import sys
from django.test import TestCase
from tests.util import DictStorage
from silk.collector import DataCollector
from silk.config import SilkyConfig
from .factories import RequestMinFactory
class TestCollector(TestCase):
def test_singleton(self):
a = DataCollector()
b = DataCollector()
c = DataCollector()
self.assertTrue(a == b == c)
def test_query_registration(self):
mock_query = {}
DataCollector().register_query(mock_query)
self.assertIn(mock_query, list(DataCollector().queries.values()))
def test_clear(self):
self.test_query_registration()
DataCollector().clear()
self.assertFalse(DataCollector().queries)
def test_finalise(self):
request = RequestMinFactory()
DataCollector().configure(request)
with self.subTest("Default file-based storage"):
DataCollector().finalise()
file = DataCollector().request.prof_file
self.assertIsNotNone(file)
with file.storage.open(file.name) as f:
content = f.read()
self.assertTrue(content)
# Some storages, such as S3Boto3Storage, don't support local file system path.
# Simulate this behaviour using DictStorage.
with self.subTest("Pathless storage"):
request.prof_file.storage = DictStorage()
DataCollector().finalise()
file = DataCollector().request.prof_file
self.assertIsNotNone(file)
with file.storage.open(file.name) as f:
content = f.read()
self.assertTrue(content)
self.assertGreater(len(content), 0)
def test_configure_exception(self):
other_profiler = cProfile.Profile()
other_profiler.enable()
collector = DataCollector()
collector.configure()
other_profiler.disable()
if sys.version_info >= (3, 12):
self.assertEqual(collector.local.pythonprofiler, None)
else:
self.assertIsNotNone(collector.local.pythonprofiler)
collector.stop_python_profiler()
def test_profile_file_name_with_disabled_extended_file_name(self):
SilkyConfig().SILKY_PYTHON_PROFILER_EXTENDED_FILE_NAME = False
request_path = 'normal/uri/'
resulting_prefix = self._get_prof_file_name(request_path)
self.assertEqual(resulting_prefix, '')
def test_profile_file_name_with_enabled_extended_file_name(self):
SilkyConfig().SILKY_PYTHON_PROFILER_EXTENDED_FILE_NAME = True
request_path = 'normal/uri/'
resulting_prefix = self._get_prof_file_name(request_path)
self.assertEqual(resulting_prefix, 'normal_uri_')
def test_profile_file_name_with_path_traversal_and_special_char(self):
SilkyConfig().SILKY_PYTHON_PROFILER_EXTENDED_FILE_NAME = True
request_path = 'spÉciàl/.././大/uri/@É/'
resulting_prefix = self._get_prof_file_name(request_path)
self.assertEqual(resulting_prefix, 'special_uri_e_')
def test_profile_file_name_with_long_path(self):
SilkyConfig().SILKY_PYTHON_PROFILER_EXTENDED_FILE_NAME = True
request_path = 'long/path/' + 'a' * 100
resulting_prefix = self._get_prof_file_name(request_path)
# the path is limited to 50 char plus the last `_`
self.assertEqual(len(resulting_prefix), 51)
@classmethod
def _get_prof_file_name(cls, request_path: str) -> str:
request = RequestMinFactory()
request.path = request_path
DataCollector().configure(request)
DataCollector().finalise()
file_path = DataCollector().request.prof_file.name
filename = os.path.basename(file_path)
return filename.replace(f"{request.id}.prof", "")
================================================
FILE: project/tests/test_command_garbage_collect.py
================================================
from django.core import management
from django.test import TestCase
from silk import models
from silk.config import SilkyConfig
from .factories import RequestMinFactory
class TestViewClearDB(TestCase):
def test_garbage_collect_command(self):
SilkyConfig().SILKY_MAX_RECORDED_REQUESTS = 2
RequestMinFactory.create_batch(3)
self.assertEqual(models.Request.objects.count(), 3)
management.call_command("silk_request_garbage_collect")
self.assertEqual(models.Request.objects.count(), 2)
management.call_command("silk_request_garbage_collect", max_requests=1)
self.assertEqual(models.Request.objects.count(), 1)
management.call_command(
"silk_request_garbage_collect", max_requests=0, verbosity=2
)
self.assertEqual(models.Request.objects.count(), 0)
================================================
FILE: project/tests/test_compat.py
================================================
import json
from unittest.mock import Mock
from django.test import TestCase
from silk.model_factory import ResponseModelFactory
DJANGO_META_CONTENT_TYPE = 'CONTENT_TYPE'
HTTP_CONTENT_TYPE = 'content-type'
class TestByteStringCompatForResponse(TestCase):
def test_bytes_compat(self):
"""
Test ResponseModelFactory formats json with bytes content
"""
mock = Mock()
mock.headers = {HTTP_CONTENT_TYPE: 'application/json;'}
d = {'k': 'v'}
mock.content = bytes(json.dumps(d), 'utf-8')
mock.get = mock.headers.get
factory = ResponseModelFactory(mock)
body, content = factory.body()
self.assertDictEqual(json.loads(body), d)
================================================
FILE: project/tests/test_config_auth.py
================================================
from django.contrib.auth.models import User
from django.test import TestCase
from django.urls import NoReverseMatch, reverse
from silk.config import SilkyConfig, default_permissions
from silk.middleware import silky_reverse
class TestAuth(TestCase):
def test_authentication(self):
SilkyConfig().SILKY_AUTHENTICATION = True
response = self.client.get(silky_reverse('requests'))
self.assertEqual(response.status_code, 302)
url = response.url
try:
# If we run tests within the django_silk project, a login url is available from example_app
self.assertIn(reverse('login'), url)
except NoReverseMatch:
# Otherwise the Django default login url is used, in which case we can test for that instead
self.assertIn('http://testserver/login/', url)
def test_default_authorisation(self):
SilkyConfig().SILKY_AUTHENTICATION = True
SilkyConfig().SILKY_AUTHORISATION = True
SilkyConfig().SILKY_PERMISSIONS = default_permissions
username_and_password = 'bob' # bob is an imbecile and uses the same pass as his username
user = User.objects.create(username=username_and_password)
user.set_password(username_and_password)
user.save()
self.client.login(username=username_and_password, password=username_and_password)
response = self.client.get(silky_reverse('requests'))
self.assertEqual(response.status_code, 403)
user.is_staff = True
user.save()
response = self.client.get(silky_reverse('requests'))
self.assertEqual(response.status_code, 200)
def test_custom_authorisation(self):
SilkyConfig().SILKY_AUTHENTICATION = True
SilkyConfig().SILKY_AUTHORISATION = True
def custom_authorisation(user):
return user.username.startswith('mike')
SilkyConfig().SILKY_PERMISSIONS = custom_authorisation
username_and_password = 'bob' # bob is an imbecile and uses the same pass as his username
user = User.objects.create(username=username_and_password)
user.set_password(username_and_password)
user.save()
self.client.login(username=username_and_password, password=username_and_password)
response = self.client.get(silky_reverse('requests'))
self.assertEqual(response.status_code, 403)
user.username = 'mike2'
user.save()
response = self.client.get(silky_reverse('requests'))
self.assertEqual(response.status_code, 200)
================================================
FILE: project/tests/test_config_long_urls.py
================================================
from unittest.mock import Mock
from django.test import TestCase
from silk.model_factory import RequestModelFactory
class TestLongRequestUrl(TestCase):
def test_no_long_url(self):
url = '1234567890' * 19 # 190-character URL
mock_request = Mock()
mock_request.headers = {'content-type': 'text/plain'}
mock_request.GET = {}
mock_request.path = url
mock_request.method = 'get'
request_model = RequestModelFactory(mock_request).construct_request_model()
self.assertEqual(request_model.path, url)
def test_long_url(self):
url = '1234567890' * 200 # 2000-character URL
mock_request = Mock()
mock_request.headers = {'content-type': 'text/plain'}
mock_request.GET = {}
mock_request.method = 'get'
mock_request.path = url
request_model = RequestModelFactory(mock_request).construct_request_model()
self.assertEqual(request_model.path, f'{url[:94]}...{url[1907:]}')
self.assertEqual(len(request_model.path), 190)
================================================
FILE: project/tests/test_config_max_body_size.py
================================================
from unittest.mock import Mock
from django.test import TestCase
from django.urls import reverse
from silk.collector import DataCollector
from silk.config import SilkyConfig
from silk.model_factory import RequestModelFactory, ResponseModelFactory
from silk.models import Request
class TestMaxBodySizeRequest(TestCase):
def test_no_max_request(self):
SilkyConfig().SILKY_MAX_REQUEST_BODY_SIZE = -1
mock_request = Mock()
mock_request.headers = {'content-type': 'text/plain'}
mock_request.GET = {}
mock_request.path = reverse('silk:requests')
mock_request.method = 'get'
mock_request.body = b'a' * 1000 # 1000 bytes?
request_model = RequestModelFactory(mock_request).construct_request_model()
self.assertTrue(request_model.raw_body)
def test_max_request(self):
SilkyConfig().SILKY_MAX_REQUEST_BODY_SIZE = 10 # 10kb
mock_request = Mock()
mock_request.headers = {'content-type': 'text/plain'}
mock_request.GET = {}
mock_request.method = 'get'
mock_request.body = b'a' * 1024 * 100 # 100kb
mock_request.path = reverse('silk:requests')
request_model = RequestModelFactory(mock_request).construct_request_model()
self.assertFalse(request_model.raw_body)
class TestMaxBodySizeResponse(TestCase):
def setUp(self):
DataCollector().request = Request.objects.create()
def test_no_max_response(self):
SilkyConfig().SILKY_MAX_RESPONSE_BODY_SIZE = -1
mock_response = Mock()
mock_response.headers = {'content-type': 'text/plain'}
mock_response.content = b'a' * 1000 # 1000 bytes?
mock_response.status_code = 200
mock_response.get = mock_response.headers.get
response_model = ResponseModelFactory(mock_response).construct_response_model()
self.assertTrue(response_model.raw_body)
def test_max_response(self):
SilkyConfig().SILKY_MAX_RESPONSE_BODY_SIZE = 10 # 10kb
mock_response = Mock()
mock_response.headers = {'content-type': 'text/plain'}
mock_response.content = b'a' * 1024 * 100 # 100kb
mock_response.status_code = 200
mock_response.get = mock_response.headers.get
response_model = ResponseModelFactory(mock_response).construct_response_model()
self.assertFalse(response_model.raw_body)
================================================
FILE: project/tests/test_config_meta.py
================================================
from unittest.mock import NonCallableMock
from django.test import TestCase
from silk.collector import DataCollector
from silk.config import SilkyConfig
from silk.middleware import SilkyMiddleware
from silk.models import Request
from .util import delete_all_models
def fake_get_response():
def fake_response():
return 'hello world'
return fake_response
class TestConfigMeta(TestCase):
def _mock_response(self):
response = NonCallableMock()
response.headers = {}
response.status_code = 200
response.queries = []
response.get = response.headers.get
response.content = ''
return response
def _execute_request(self):
delete_all_models(Request)
DataCollector().configure(Request.objects.create())
response = self._mock_response()
SilkyMiddleware(fake_get_response)._process_response('', response)
self.assertTrue(response.status_code == 200)
objs = Request.objects.all()
self.assertEqual(objs.count(), 1)
r = objs[0]
return r
def test_enabled(self):
SilkyConfig().SILKY_META = True
r = self._execute_request()
self.assertTrue(r.meta_time is not None
or r.meta_num_queries is not None
or r.meta_time_spent_queries is not None)
def test_disabled(self):
SilkyConfig().SILKY_META = False
r = self._execute_request()
self.assertFalse(r.meta_time)
================================================
FILE: project/tests/test_db.py
================================================
"""
Test profiling of DB queries without mocking, to catch possible
incompatibility
"""
from django.shortcuts import reverse
from django.test import Client, TestCase
from silk.collector import DataCollector
from silk.config import SilkyConfig
from silk.models import Request
from silk.profiling.profiler import silk_profile
from .factories import BlindFactory
class TestDbQueries(TestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
BlindFactory.create_batch(size=5)
SilkyConfig().SILKY_META = False
def test_profile_request_to_db(self):
DataCollector().configure(Request(reverse('example_app:index')))
with silk_profile(name='test_profile'):
resp = self.client.get(reverse('example_app:index'))
DataCollector().profiles.values()
assert len(resp.context['blinds']) == 5
def test_profile_request_to_db_with_constraints(self):
DataCollector().configure(Request(reverse('example_app:create')))
resp = self.client.post(reverse('example_app:create'), {'name': 'Foo'})
self.assertEqual(resp.status_code, 302)
class TestAnalyzeQueries(TestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
BlindFactory.create_batch(size=5)
SilkyConfig().SILKY_META = False
SilkyConfig().SILKY_ANALYZE_QUERIES = True
@classmethod
def tearDownClass(cls):
super().tearDownClass()
SilkyConfig().SILKLY_ANALYZE_QUERIES = False
def test_analyze_queries(self):
DataCollector().configure(Request(reverse('example_app:index')))
client = Client()
with silk_profile(name='test_profile'):
resp = client.get(reverse('example_app:index'))
DataCollector().profiles.values()
assert len(resp.context['blinds']) == 5
class TestAnalyzeQueriesExplainParams(TestAnalyzeQueries):
@classmethod
def setUpClass(cls):
super().setUpClass()
SilkyConfig().SILKY_EXPLAIN_FLAGS = {'verbose': True}
@classmethod
def tearDownClass(cls):
super().tearDownClass()
SilkyConfig().SILKY_EXPLAIN_FLAGS = None
================================================
FILE: project/tests/test_dynamic_profiling.py
================================================
from unittest.mock import patch
from django.test import TestCase
import silk
from silk.profiling.dynamic import (
_get_module,
_get_parent_module,
profile_function_or_method,
)
from .test_lib.assertion import dict_contains
from .util import mock_data_collector
class TestGetModule(TestCase):
"""test for _get_module"""
def test_singular(self):
module = _get_module('silk')
self.assertEqual(module.__class__.__name__, 'module')
self.assertEqual('silk', module.__name__)
self.assertTrue(hasattr(module, 'models'))
def test_dot(self):
module = _get_module('silk.models')
self.assertEqual(module.__class__.__name__, 'module')
self.assertEqual('silk.models', module.__name__)
self.assertTrue(hasattr(module, 'SQLQuery'))
class TestGetParentModule(TestCase):
"""test for silk.tools._get_parent_module"""
def test_singular(self):
parent = _get_parent_module(silk)
self.assertIsInstance(parent, dict)
def test_dot(self):
import silk.utils
parent = _get_parent_module(silk.utils)
self.assertEqual(parent, silk)
class MyClass:
def foo(self):
pass
def foo():
pass
def source_file_name():
file_name = __file__
if file_name[-1] == 'c':
file_name = file_name[:-1]
return file_name
class TestProfileFunction(TestCase):
def test_method_as_str(self):
# noinspection PyShadowingNames
def foo(_):
pass
# noinspection PyUnresolvedReferences
with patch.object(MyClass, 'foo', foo):
profile_function_or_method('tests.test_dynamic_profiling', 'MyClass.foo', 'test')
dc = mock_data_collector()
with patch('silk.profiling.profiler.DataCollector', return_value=dc) as mock_DataCollector:
MyClass().foo()
self.assertEqual(mock_DataCollector.return_value.register_profile.call_count, 1)
call_args = mock_DataCollector.return_value.register_profile.call_args[0][0]
self.assertTrue(dict_contains({
'func_name': foo.__name__,
'dynamic': True,
'file_path': source_file_name(),
'name': 'test',
'line_num': foo.__code__.co_firstlineno
}, call_args))
def test_func_as_str(self):
name = foo.__name__
line_num = foo.__code__.co_firstlineno
profile_function_or_method('tests.test_dynamic_profiling', 'foo', 'test')
dc = mock_data_collector()
with patch('silk.profiling.profiler.DataCollector', return_value=dc) as mock_DataCollector:
foo()
self.assertEqual(mock_DataCollector.return_value.register_profile.call_count, 1)
call_args = mock_DataCollector.return_value.register_profile.call_args[0][0]
self.assertTrue(dict_contains({
'func_name': name,
'dynamic': True,
'file_path': source_file_name(),
'name': 'test',
'line_num': line_num
}, call_args))
================================================
FILE: project/tests/test_encoding.py
================================================
import json
from unittest.mock import Mock
from django.test import TestCase
from silk.model_factory import RequestModelFactory, ResponseModelFactory
HTTP_CONTENT_TYPE = 'content-type'
class TestEncodingForRequests(TestCase):
"""
Check that the RequestModelFactory deals with encodings correctly via charset
"""
def test_utf_plain(self):
mock_request = Mock()
mock_request.headers = {HTTP_CONTENT_TYPE: 'text/plain; charset=UTF-8'}
mock_request.body = '语'
mock_request.get = mock_request.headers.get
factory = RequestModelFactory(mock_request)
body, raw_body = factory.body()
self.assertFalse(body)
self.assertEqual(raw_body, mock_request.body)
def test_plain(self):
mock_request = Mock()
mock_request.headers = {HTTP_CONTENT_TYPE: 'text/plain'}
mock_request.body = 'sdfsdf'
mock_request.get = mock_request.headers.get
factory = RequestModelFactory(mock_request)
body, raw_body = factory.body()
self.assertFalse(body)
self.assertEqual(raw_body, mock_request.body)
def test_utf_json_not_encoded(self):
mock_request = Mock()
mock_request.headers = {HTTP_CONTENT_TYPE: 'application/json; charset=UTF-8'}
d = {'x': '语'}
mock_request.body = json.dumps(d)
mock_request.get = mock_request.headers.get
factory = RequestModelFactory(mock_request)
body, raw_body = factory.body()
self.assertDictEqual(json.loads(body), d)
self.assertEqual(raw_body, mock_request.body)
def test_utf_json_encoded(self):
mock_request = Mock()
mock_request.headers = {HTTP_CONTENT_TYPE: 'application/json; charset=UTF-8'}
d = {'x': '语'}
mock_request.body = json.dumps(d).encode('UTF-8')
mock_request.get = mock_request.headers.get
factory = RequestModelFactory(mock_request)
body, raw_body = factory.body()
self.assertDictEqual(json.loads(body), d)
self.assertEqual(raw_body, mock_request.body.decode('UTF-8'))
def test_utf_json_encoded_no_charset(self):
"""default to UTF-8"""
mock_request = Mock()
mock_request.headers = {HTTP_CONTENT_TYPE: 'application/json'}
d = {'x': '语'}
mock_request.body = json.dumps(d).encode('UTF-8')
mock_request.get = mock_request.headers.get
factory = RequestModelFactory(mock_request)
body, raw_body = factory.body()
self.assertDictEqual(json.loads(body), d)
self.assertEqual(raw_body, mock_request.body.decode('UTF-8'))
def test_invalid_encoding_json(self):
mock_request = Mock()
mock_request.headers = {HTTP_CONTENT_TYPE: 'application/json; charset=asdas-8'}
d = {'x': '语'}
mock_request.body = json.dumps(d).encode('UTF-8')
mock_request.get = mock_request.headers.get
factory = RequestModelFactory(mock_request)
body, raw_body = factory.body()
self.assertDictEqual(json.loads(body), d)
self.assertEqual(raw_body, raw_body)
class TestEncodingForResponse(TestCase):
"""
Check that the ResponseModelFactory deals with encodings correctly via charset
"""
def test_utf_plain(self):
mock = Mock()
mock.headers = {HTTP_CONTENT_TYPE: 'text/plain; charset=UTF-8'}
mock.content = '语'
mock.get = mock.headers.get
factory = ResponseModelFactory(mock)
body, content = factory.body()
self.assertFalse(body)
self.assertEqual(content, mock.content)
def test_plain(self):
mock = Mock()
mock.headers = {HTTP_CONTENT_TYPE: 'text/plain'}
mock.content = 'sdfsdf'
mock.get = mock.headers.get
factory = ResponseModelFactory(mock)
body, content = factory.body()
self.assertFalse(body)
self.assertEqual(content, mock.content)
def test_utf_json_not_encoded(self):
mock = Mock()
mock.headers = {HTTP_CONTENT_TYPE: 'application/json; charset=UTF-8'}
d = {'x': '语'}
mock.content = json.dumps(d)
mock.get = mock.headers.get
factory = ResponseModelFactory(mock)
body, content = factory.body()
self.assertDictEqual(json.loads(body), d)
self.assertEqual(content, mock.content)
def test_utf_json_encoded(self):
mock = Mock()
mock.headers = {HTTP_CONTENT_TYPE: 'application/json; charset=UTF-8'}
d = {'x': '语'}
mock.content = json.dumps(d)
mock.get = mock.headers.get
factory = ResponseModelFactory(mock)
body, content = factory.body()
self.assertDictEqual(json.loads(body), d)
self.assertEqual(content, mock.content)
def test_utf_json_encoded_no_charset(self):
"""default to UTF-8"""
mock = Mock()
mock.headers = {HTTP_CONTENT_TYPE: 'application/json'}
d = {'x': '语'}
mock.content = json.dumps(d)
mock.get = mock.headers.get
factory = ResponseModelFactory(mock)
body, content = factory.body()
self.assertDictEqual(json.loads(body), d)
self.assertEqual(content, mock.content)
def test_invalid_encoding_json(self):
mock = Mock()
mock.headers = {HTTP_CONTENT_TYPE: 'application/json; charset=asdas-8'}
d = {'x': '语'}
mock.content = json.dumps(d)
mock.get = mock.headers.get
factory = ResponseModelFactory(mock)
body, content = factory.body()
self.assertDictEqual(json.loads(body), d)
self.assertEqual(mock.content, content)
================================================
FILE: project/tests/test_end_points.py
================================================
import random
from django.db.models import Count, F
from django.test import TestCase
from django.urls import reverse
from silk import models
from silk.config import SilkyConfig
from silk.middleware import silky_reverse
from .test_lib.mock_suite import MockSuite
class TestEndPoints(TestCase):
"""
Hit all the endpoints to check everything actually renders/no error 500s etc.
Each test will ensure that an object with something to display is chosen to be rendered e.g.
a request/profile that has queries
"""
@classmethod
def setUpClass(cls):
super().setUpClass()
# We're not testing auth here.
SilkyConfig().SILKY_AUTHORISATION = False
SilkyConfig().SILKY_AUTHENTICATION = False
mock_suite = MockSuite()
for _ in range(0, 100):
mock_suite.mock_request()
def test_summary(self):
response = self.client.get(silky_reverse('summary'))
self.assertTrue(response.status_code == 200)
def test_requests(self):
response = self.client.get(silky_reverse('requests'))
self.assertTrue(response.status_code == 200)
def test_request_detail_on_get_request(self):
request_id = random.choice(
models.Request.objects.filter(method='GET').values_list('id', flat=True),
)
response = self.client.get(silky_reverse('request_detail', kwargs={
'request_id': request_id
}))
self.assertEqual(response.status_code, 200)
def test_request_detail_on_post_request(self):
request_id = random.choice(
models.Request.objects.filter(method='POST').values_list('id', flat=True),
)
response = self.client.get(silky_reverse('request_detail', kwargs={
'request_id': request_id
}))
self.assertEqual(response.status_code, 200)
def test_request_sql(self):
request_query_data = random.choice(
models.SQLQuery.objects
.values('request_id')
.filter(request_id__isnull=False)
)
request_id = request_query_data['request_id']
base_url = silky_reverse('request_sql', kwargs={'request_id': request_id})
response = self.client.get(base_url)
self.assertTrue(response.status_code == 200)
# Test with valid page size
response = self.client.get(base_url + "?per_page=100")
self.assertTrue(response.status_code == 200)
# Test with invalid page size
response = self.client.get(base_url + "?per_page=notanumber")
self.assertTrue(response.status_code == 200)
def test_request_sql_detail(self):
kwargs = random.choice(
models.SQLQuery.objects
.annotate(sql_id=F('id'))
.values('sql_id', 'request_id')
.filter(request_id__isnull=False)
)
response = self.client.get(silky_reverse('request_sql_detail', kwargs=kwargs))
self.assertTrue(response.status_code == 200)
def test_raw(self):
request_query_data = random.choice(
models.Request.objects
.values('id')
.filter(body__isnull=False)
)
request_id = request_query_data['id']
url = reverse('silk:raw', kwargs={
'request_id': request_id
}) + '?typ=request&subtyp=processed'
response = self.client.get(url)
code = response.status_code
self.assertTrue(code == 200)
def test_request_profiling(self):
request_id = random.choice(
models.Profile.objects
.values('request_id')
.filter(request_id__isnull=False)
)
response = self.client.get(silky_reverse('request_profiling', kwargs=request_id))
self.assertTrue(response.status_code == 200)
def test_request_profile_detail(self):
kwargs = random.choice(
models.Profile.objects
.annotate(profile_id=F('id'))
.values('profile_id', 'request_id')
.filter(request_id__isnull=False)
)
response = self.client.get(silky_reverse('request_profile_detail', kwargs=kwargs))
self.assertTrue(response.status_code == 200)
def test_request_and_profile_sql(self):
kwargs = random.choice(
models.Profile.objects
.annotate(num=Count('queries'), profile_id=F('id'))
.values('profile_id', 'request_id')
.filter(request_id__isnull=False, num__gt=0)
)
response = self.client.get(silky_reverse('request_and_profile_sql', kwargs=kwargs))
self.assertTrue(response.status_code == 200)
def test_request_and_profile_sql_detail(self):
random_profile = random.choice(
models.Profile.objects
.annotate(num=Count('queries'), profile_id=F('id'))
.values('profile_id', 'request_id')
.filter(request_id__isnull=False, num__gt=0)
)
random_sql_query = random.choice(
models.SQLQuery.objects
.annotate(sql_id=F('id'))
.values('sql_id')
.filter(profiles__id=random_profile['profile_id'])
)
kwargs = {}
kwargs.update(random_profile)
kwargs.update(random_sql_query)
response = self.client.get(silky_reverse('request_and_profile_sql_detail', kwargs=kwargs))
self.assertTrue(response.status_code == 200)
def test_profile_detail(self):
profile_query_data = random.choice(models.Profile.objects.values('id'))
profile_id = profile_query_data['id']
response = self.client.get(silky_reverse('profile_detail', kwargs={
'profile_id': profile_id
}))
self.assertTrue(response.status_code == 200)
def test_profile_sql(self):
profile_query_data = random.choice(
models.Profile.objects
.annotate(num=Count('queries'))
.values('id')
.filter(num__gt=0)
)
profile_id = profile_query_data['id']
response = self.client.get(silky_reverse('profile_sql', kwargs={'profile_id': profile_id}))
self.assertTrue(response.status_code == 200)
def test_profile_sql_detail(self):
profile_query_data = random.choice(
models.Profile.objects
.annotate(num=Count('queries'))
.values('id')
.filter(num__gt=0)
)
profile_id = profile_query_data['id']
sql_id = random.choice(models.SQLQuery.objects.filter(profiles=profile_id)).pk
response = self.client.get(silky_reverse('profile_sql_detail', kwargs={'profile_id': profile_id,
'sql_id': sql_id}))
self.assertTrue(response.status_code == 200)
def test_profiling(self):
response = self.client.get(silky_reverse('profiling'))
self.assertTrue(response.status_code == 200)
================================================
FILE: project/tests/test_execute_sql.py
================================================
from unittest.mock import Mock, NonCallableMagicMock, NonCallableMock, patch
from django.test import TestCase
from django.utils.encoding import force_str
from silk.collector import DataCollector
from silk.models import Request, SQLQuery
from silk.sql import execute_sql
from .util import delete_all_models
_simple_mock_query_sql = 'SELECT * FROM table_name WHERE column1 = %s'
_simple_mock_query_params = ('asdf',)
_non_unicode_binary_mock_query_params = (b'\x0a\x00\x00\xff',)
_unicode_binary_mock_query_params = ('🫠'.encode(),)
def mock_sql(mock_query_params):
mock_sql_query = Mock(spec_set=['_execute_sql', 'query', 'as_sql', 'connection'])
mock_sql_query._execute_sql = Mock()
mock_sql_query.query = NonCallableMock(spec_set=['model'])
mock_sql_query.query.model = Mock()
mock_sql_query.as_sql = Mock(return_value=(_simple_mock_query_sql, mock_query_params))
mock_sql_query.connection = NonCallableMock(
spec_set=['cursor', 'features', 'ops'],
cursor=Mock(
spec_set=['__call__'],
return_value=NonCallableMagicMock(spec_set=['__enter__', '__exit__', 'execute'])
),
features=NonCallableMock(
spec_set=['supports_explaining_query_execution'],
supports_explaining_query_execution=True
),
ops=NonCallableMock(spec_set=['explain_query_prefix'],
explain_query_prefix=Mock(return_value='')),
)
return mock_sql_query, mock_query_params
class BaseTestCase(TestCase):
def tearDown(self):
DataCollector().stop_python_profiler()
def call_execute_sql(self, request, mock_query_params):
DataCollector().configure(request=request)
delete_all_models(SQLQuery)
self.query_string = _simple_mock_query_sql
self.mock_sql, self.query_params = mock_sql(mock_query_params)
self.kwargs = {
'one': 1,
'two': 2
}
self.args = [1, 2]
execute_sql(self.mock_sql, *self.args, **self.kwargs)
class TestCallNoRequest(BaseTestCase):
def setUp(self):
super().setUp()
self.call_execute_sql(None, _simple_mock_query_params)
def test_called(self):
self.mock_sql._execute_sql.assert_called_once_with(*self.args, **self.kwargs)
def test_count(self):
self.assertEqual(0, len(DataCollector().queries))
class TestCallRequest(BaseTestCase):
def test_query_simple(self):
self.call_execute_sql(Request(), _simple_mock_query_params)
self.mock_sql._execute_sql.assert_called_once_with(*self.args, **self.kwargs)
self.assertEqual(1, len(DataCollector().queries))
query = list(DataCollector().queries.values())[0]
expected = self.query_string % tuple(force_str(param) for param in self.query_params)
self.assertEqual(query['query'], expected)
def test_query_unicode(self):
self.call_execute_sql(Request(), _unicode_binary_mock_query_params)
self.mock_sql._execute_sql.assert_called_once_with(*self.args, **self.kwargs)
self.assertEqual(1, len(DataCollector().queries))
query = list(DataCollector().queries.values())[0]
expected = self.query_string % tuple(force_str(param) for param in self.query_params)
self.assertEqual(query['query'], expected)
def test_query_non_unicode(self):
self.call_execute_sql(Request(), _non_unicode_binary_mock_query_params)
self.mock_sql._execute_sql.assert_called_once_with(*self.args, **self.kwargs)
self.assertEqual(0, len(DataCollector().queries))
class TestCallSilky(BaseTestCase):
def test_no_effect(self):
DataCollector().configure()
sql, _ = mock_sql(_simple_mock_query_params)
sql.query.model = NonCallableMagicMock(spec_set=['__module__'])
sql.query.model.__module__ = 'silk.models'
# No SQLQuery models should be created for silk requests for obvious reasons
with patch('silk.sql.DataCollector', return_value=Mock()) as mock_DataCollector:
execute_sql(sql)
self.assertFalse(mock_DataCollector().register_query.call_count)
class TestCollectorInteraction(BaseTestCase):
def _query(self):
try:
query = list(DataCollector().queries.values())[0]
except IndexError:
self.fail('No queries created')
return query
def test_request(self):
DataCollector().configure(request=Request.objects.create(path='/path/to/somewhere'))
sql, _ = mock_sql(_simple_mock_query_params)
execute_sql(sql)
query = self._query()
self.assertEqual(query['request'], DataCollector().request)
def test_registration(self):
DataCollector().configure(request=Request.objects.create(path='/path/to/somewhere'))
sql, _ = mock_sql(_simple_mock_query_params)
execute_sql(sql)
query = self._query()
self.assertIn(query, DataCollector().queries.values())
def test_explain_simple(self):
DataCollector().configure(request=Request.objects.create(path='/path/to/somewhere'))
sql, params = mock_sql(_simple_mock_query_params)
prefix = "EXPLAIN"
mock_cursor = sql.connection.cursor.return_value.__enter__.return_value
sql.connection.ops.explain_query_prefix.return_value = prefix
execute_sql(sql)
self.assertNotIn(prefix, params)
mock_cursor.execute.assert_called_once_with(f"{prefix} {_simple_mock_query_sql}", params)
def test_explain_unicode(self):
DataCollector().configure(request=Request.objects.create(path='/path/to/somewhere'))
sql, params = mock_sql(_unicode_binary_mock_query_params)
prefix = "EXPLAIN"
mock_cursor = sql.connection.cursor.return_value.__enter__.return_value
sql.connection.ops.explain_query_prefix.return_value = prefix
execute_sql(sql)
self.assertNotIn(prefix, params)
mock_cursor.execute.assert_called_once_with(f"{prefix} {_simple_mock_query_sql}", params)
def test_explain_non_unicode(self):
DataCollector().configure(request=Request.objects.create(path='/path/to/somewhere'))
sql, params = mock_sql(_non_unicode_binary_mock_query_params)
prefix = "EXPLAIN"
mock_cursor = sql.connection.cursor.return_value.__enter__.return_value
sql.connection.ops.explain_query_prefix.return_value = prefix
execute_sql(sql)
self.assertNotIn(prefix, params)
self.assertFalse(mock_cursor.execute.called)
================================================
FILE: project/tests/test_filters.py
================================================
import calendar
import random
from datetime import datetime, timedelta, timezone
from itertools import groupby
from math import floor
from django.test import TestCase
from django.utils import timezone as django_timezone
from silk import models
from silk.request_filters import (
AfterDateFilter,
BeforeDateFilter,
FunctionNameFilter,
MethodFilter,
NameFilter,
NumQueriesFilter,
OverallTimeFilter,
PathFilter,
SecondsFilter,
StatusCodeFilter,
TimeSpentOnQueriesFilter,
ViewNameFilter,
)
from .test_lib.mock_suite import MockSuite
from .util import delete_all_models
mock_suite = MockSuite()
class TestRequestFilters(TestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
def _time_stamp(self, dt):
return calendar.timegm(dt.utctimetuple())
def test_seconds_filter(self):
requests = [mock_suite.mock_request() for _ in range(0, 10)]
n = 0
for r in requests:
r.start_time = django_timezone.now() - timedelta(seconds=n)
r.save()
n += 1
requests = models.Request.objects.filter(SecondsFilter(5))
for r in requests:
dt = r.start_time
seconds = self._time_stamp(django_timezone.now()) - self._time_stamp(dt)
self.assertTrue(seconds < 6) # 6 to give a bit of leeway in case takes too long
def test_view_name_filter(self):
requests = [mock_suite.mock_request() for _ in range(0, 10)]
r = random.choice(requests)
view_name = r.view_name
requests = models.Request.objects.filter(ViewNameFilter(view_name))
for r in requests:
self.assertTrue(r.view_name == view_name)
def test_path_filter(self):
requests = [mock_suite.mock_request() for _ in range(0, 10)]
r = random.choice(requests)
path = r.path
requests = models.Request.objects.filter(PathFilter(path))
for r in requests:
self.assertTrue(r.path == path)
def test_num_queries_filter(self):
requests = [mock_suite.mock_request() for _ in range(0, 10)]
counts = sorted(x.queries.count() for x in requests)
c = counts[int(floor(len(counts) / 2))]
num_queries_filter = NumQueriesFilter(c)
query_set = models.Request.objects.all()
query_set = num_queries_filter.contribute_to_query_set(query_set)
filtered = query_set.filter(num_queries_filter)
for f in filtered:
self.assertGreaterEqual(f.queries.count(), c)
def test_time_spent_queries_filter(self):
requests = [mock_suite.mock_request() for _ in range(0, 10)]
time_taken = sorted(sum(q.time_taken for q in x.queries.all()) for x in requests)
c = time_taken[int(floor(len(time_taken) / 2))]
time_taken_filter = TimeSpentOnQueriesFilter(c)
query_set = models.Request.objects.all()
query_set = time_taken_filter.contribute_to_query_set(query_set)
filtered = query_set.filter(time_taken_filter)
for f in filtered:
self.assertGreaterEqual(sum(q.time_taken for q in f.queries.all()), c)
def test_time_spent_filter(self):
requests = [mock_suite.mock_request() for _ in range(0, 10)]
time_taken = sorted(x.time_taken for x in requests)
c = time_taken[int(floor(len(time_taken) / 2))]
time_taken_filter = OverallTimeFilter(c)
query_set = models.Request.objects.all()
query_set = time_taken_filter.contribute_to_query_set(query_set)
filtered = query_set.filter(time_taken_filter)
for f in filtered:
self.assertGreaterEqual(round(f.time_taken), round(c))
def test_status_code_filter(self):
requests = [mock_suite.mock_request() for _ in range(0, 50)]
requests = sorted(requests, key=lambda x: x.response.status_code)
by_status_code = groupby(requests, key=lambda x: x.response.status_code)
for status_code, expected in by_status_code:
status_code_filter = StatusCodeFilter(status_code)
query_set = models.Request.objects.all()
query_set = status_code_filter.contribute_to_query_set(query_set)
filtered = query_set.filter(status_code_filter)
self.assertEqual(len(list(expected)), filtered.count())
def test_method_filter(self):
requests = [mock_suite.mock_request() for _ in range(0, 50)]
requests = sorted(requests, key=lambda x: x.method)
by_method = groupby(requests, key=lambda x: x.method)
for method, expected in by_method:
method_filter = MethodFilter(method)
query_set = models.Request.objects.all()
query_set = method_filter.contribute_to_query_set(query_set)
filtered = query_set.filter(method_filter)
self.assertEqual(len(list(expected)), filtered.count())
class TestRequestAfterDateFilter(TestCase):
def assertFilter(self, dt, f):
requests = models.Request.objects.filter(f)
for r in requests:
self.assertTrue(r.start_time > dt)
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.requests = [mock_suite.mock_request() for _ in range(0, 10)]
def test_after_date_filter(self):
r = random.choice(self.requests)
dt = r.start_time
f = AfterDateFilter(dt)
self.assertFilter(dt, f)
def test_after_date_filter_str(self):
r = random.choice(self.requests)
dt = r.start_time
fmt = AfterDateFilter.fmt
dt_str = dt.strftime(fmt)
date_filter = AfterDateFilter
f = date_filter(dt_str)
new_dt = datetime.strptime(dt_str, fmt)
new_dt = django_timezone.make_aware(new_dt, timezone.utc)
self.assertFilter(new_dt, f)
class TestRequestBeforeDateFilter(TestCase):
def assertFilter(self, dt, f):
requests = models.Request.objects.filter(f)
for r in requests:
self.assertTrue(r.start_time < dt)
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.requests = [mock_suite.mock_request() for _ in range(0, 10)]
def test_before_date_filter(self):
r = random.choice(self.requests)
dt = r.start_time
f = BeforeDateFilter(dt)
self.assertFilter(dt, f)
def test_before_date_filter_str(self):
r = random.choice(self.requests)
dt = r.start_time
fmt = BeforeDateFilter.fmt
dt_str = dt.strftime(fmt)
date_filter = BeforeDateFilter
f = date_filter(dt_str)
new_dt = datetime.strptime(dt_str, fmt)
new_dt = django_timezone.make_aware(new_dt, timezone.utc)
self.assertFilter(new_dt, f)
class TestProfileFilters(TestCase):
def setUp(self):
delete_all_models(models.Profile)
def test_name_filter(self):
profiles = mock_suite.mock_profiles(n=10)
p = random.choice(profiles)
name = p.name
requests = models.Profile.objects.filter(NameFilter(name))
for p in requests:
self.assertTrue(p.name == name)
def test_function_name_filter(self):
profiles = mock_suite.mock_profiles(n=10)
p = random.choice(profiles)
func_name = p.func_name
requests = models.Profile.objects.filter(FunctionNameFilter(func_name))
for p in requests:
self.assertTrue(p.func_name == func_name)
def test_num_queries_filter(self):
profiles = mock_suite.mock_profiles(n=10)
counts = sorted(x.queries.count() for x in profiles)
c = counts[int(floor(len(counts) / 2))]
num_queries_filter = NumQueriesFilter(c)
query_set = models.Profile.objects.all()
query_set = num_queries_filter.contribute_to_query_set(query_set)
filtered = query_set.filter(num_queries_filter)
for f in filtered:
self.assertGreaterEqual(f.queries.count(), c)
def test_time_spent_queries_filter(self):
profiles = mock_suite.mock_profiles(n=10)
time_taken = sorted(sum(q.time_taken for q in x.queries.all()) for x in profiles)
c = time_taken[int(floor(len(time_taken) / 2))]
time_taken_filter = TimeSpentOnQueriesFilter(c)
query_set = models.Profile.objects.all()
query_set = time_taken_filter.contribute_to_query_set(query_set)
filtered = query_set.filter(time_taken_filter)
for f in filtered:
self.assertGreaterEqual(sum(q.time_taken for q in f.queries.all()), c)
def test_time_spent_filter(self):
profiles = [mock_suite.mock_request() for _ in range(0, 10)]
time_taken = sorted(x.time_taken for x in profiles)
c = time_taken[int(floor(len(time_taken) / 2))]
time_taken_filter = OverallTimeFilter(c)
query_set = models.Profile.objects.all()
query_set = time_taken_filter.contribute_to_query_set(query_set)
filtered = query_set.filter(time_taken_filter)
for f in filtered:
self.assertGreaterEqual(f.time_taken, c)
================================================
FILE: project/tests/test_lib/__init__.py
================================================
__author__ = 'mtford'
================================================
FILE: project/tests/test_lib/assertion.py
================================================
def dict_contains(child_dict, parent_dict):
for key, value in child_dict.items():
if key not in parent_dict:
return False
if parent_dict[key] != value:
return False
return True
================================================
FILE: project/tests/test_lib/mock_suite.py
================================================
import json
import os
import random
import traceback
from datetime import timedelta
from django.core import management
from django.utils import timezone
from silk import models
from silk.models import Profile, SQLQuery
class MockSuite:
"""
Provides some fake data to play around with. Also useful for testing
"""
methods = ['GET', 'POST', 'PUT', 'PATCH', 'HEAD', 'OPTIONS']
path_components = ['path', 'to', 'somewhere', 'around', 'here', 'bobs', 'your', 'uncle']
status_codes = [200, 201, 300, 301, 302, 403, 404, 500]
profile_names = ['slow_bit_of_code', 'terrible_dependency', 'what_on_earth_is_this_code_doing']
file_path = [os.path.realpath(__file__)]
func_names = ['', '', '', 'foo', 'bar']
view_names = ['app:blah', 'index', 'root', 'xxx:xyx']
sql_queries = ['''
SELECT Book.title AS Title,
COUNT(*) AS Authors
FROM Book
JOIN Book_author
ON Book.isbn = Book_author.isbn
GROUP BY Book.title;
''',
'''
SELECT * FROM table
''', '''
SELECT *
FROM Book
WHERE price > 100.00
ORDER BY title;
''', '''
SELECT title,
COUNT(*) AS Authors
FROM Book
NATURAL JOIN Book_author
GROUP BY title;
''',
'''
SELECT A.Col1, A.Col2, B.Col1,B.Col2
FROM (SELECT RealTableZ.Col1, RealTableY.Col2, RealTableY.ID AS ID
FROM RealTableZ
LEFT OUTER JOIN RealTableY
ON RealTableZ.ForeignKeyY=RealTableY.ID
WHERE RealTableY.Col11>14
) AS B
INNER JOIN A
ON A.ForeignKeyY=B.ID
''']
response_content_types = ['text/html', 'application/json', 'text/css']
response_content = {
'text/html': ['<html></html>'],
'text/css': ['#blah {font-weight: bold}'],
'application/json': ['[1, 2, 3]']
}
request_content_types = ['application/json']
request_content = {
'application/json': ['{"blah": 5}']
}
def _random_method(self):
return random.choice(self.methods)
def _random_path(self):
num_components = random.randint(1, 5)
return '/' + '/'.join(random.sample(self.path_components, num_components)) + '/'
def _random_query(self):
return random.choice(self.sql_queries)
def mock_sql_queries(self, request=None, profile=None, n=1, as_dict=False):
start_time, end_time = self._random_time()
queries = []
for _ in range(0, n):
tb = ''.join(reversed(traceback.format_stack()))
d = {
'query': self._random_query(),
'start_time': start_time,
'end_time': end_time,
'request': request,
'traceback': tb
}
if as_dict:
queries.append(d)
else:
query = SQLQuery.objects.create(**d)
queries.append(query)
if profile:
if as_dict:
for q in queries:
profile['queries'].append(q)
else:
profile.queries.set(queries)
return queries
def mock_profile(self, request=None):
start_time, end_time = self._random_time()
dynamic = random.choice([True, False])
profile = Profile.objects.create(start_time=start_time,
end_time=end_time,
request=request,
name=random.choice(self.profile_names),
file_path=random.choice(self.file_path),
line_num=3,
func_name=random.choice(self.func_names),
dynamic=dynamic,
end_line_num=6 if dynamic else None,
exception_raised=random.choice([True, False])
)
self.mock_sql_queries(profile=profile, n=random.randint(0, 10))
return profile
def mock_profiles(self, request=None, n=1):
profiles = []
for _ in range(0, n):
profile = self.mock_profile(request)
profiles.append(profile)
return profiles
def _random_time(self):
start_time = timezone.now()
duration = timedelta(milliseconds=random.randint(0, 3000))
end_time = start_time + duration
return start_time, end_time
def mock_request(self):
start_time, end_time = self._random_time()
num_sql_queries = random.randint(0, 20)
request_content_type = random.choice(self.request_content_types)
request_body = random.choice(self.request_content[request_content_type])
time_taken = end_time - start_time
time_taken = time_taken.total_seconds()
request = models.Request.objects.create(method=self._random_method(),
path=self._random_path(),
num_sql_queries=num_sql_queries,
start_time=start_time,
end_time=end_time,
view_name=random.choice(self.view_names),
time_taken=time_taken,
encoded_headers=json.dumps({'content-type': request_content_type}),
body=request_body)
response_content_type = random.choice(self.response_content_types)
response_body = random.choice(self.response_content[response_content_type])
models.Response.objects.create(request=request,
status_code=random.choice(self.status_codes),
encoded_headers=json.dumps({'content-type': response_content_type}),
body=response_body)
self.mock_sql_queries(request=request, n=num_sql_queries)
self.mock_profiles(request, random.randint(0, 2))
return request
if __name__ == '__main__':
management.call_command('flush', interactive=False)
requests = [MockSuite().mock_request() for _ in range(0, 100)]
================================================
FILE: project/tests/test_models.py
================================================
import datetime
import uuid
from django.core.management import call_command
from django.test import TestCase, override_settings
from freezegun import freeze_time
from silk import models
from silk.config import SilkyConfig
from silk.storage import ProfilerResultStorage
from .factories import RequestMinFactory, ResponseFactory, SQLQueryFactory
# TODO test atomicity
# http://stackoverflow.com/questions/13397038/uuid-max-character-length
# UUID_MAX_LENGTH = 36
# TODO move to separate file test and collection it self
class CaseInsensitiveDictionaryTest:
pass
class RequestTest(TestCase):
def setUp(self):
self.obj = RequestMinFactory.create()
self.max_percent = SilkyConfig().SILKY_MAX_RECORDED_REQUESTS_CHECK_PERCENT
self.max_requests = SilkyConfig().SILKY_MAX_RECORDED_REQUESTS
def tearDown(self):
SilkyConfig().SILKY_MAX_RECORDED_REQUESTS_CHECK_PERCENT = self.max_percent
SilkyConfig().SILKY_MAX_RECORDED_REQUESTS = self.max_requests
def test_uuid_is_primary_key(self):
self.assertIsInstance(self.obj.id, uuid.UUID)
@freeze_time('2016-01-01 12:00:00')
def test_start_time_field_default(self):
obj = RequestMinFactory.create()
self.assertEqual(obj.start_time, datetime.datetime(2016, 1, 1, 12, 0, 0, tzinfo=datetime.timezone.utc))
def test_total_meta_time_if_have_no_meta_and_queries_time(self):
self.assertEqual(self.obj.total_meta_time, 0)
def test_total_meta_time_if_have_meta_time_spent_queries(self):
obj = RequestMinFactory.create(meta_time_spent_queries=10.5)
self.assertEqual(obj.total_meta_time, 10.5)
def test_total_meta_time_if_meta_time(self):
obj = RequestMinFactory.create(meta_time=3.3)
self.assertEqual(obj.total_meta_time, 3.3)
def test_total_meta_if_self_have_it_meta_and_queries_time(self):
obj = RequestMinFactory.create(meta_time=3.3, meta_time_spent_queries=10.5)
self.assertEqual(obj.total_meta_time, 13.8)
def test_time_spent_on_sql_queries_if_has_no_related_SQLQueries(self):
self.assertEqual(self.obj.time_spent_on_sql_queries, 0)
def test_time_spent_on_sql_queries_if_has_related_SQLQueries_with_no_time_taken(self):
query = SQLQueryFactory()
self.obj.queries.add(query)
self.assertEqual(query.time_taken, None)
# No exception should be raised, and the result should be 0.0
self.assertEqual(self.obj.time_spent_on_sql_queries, 0.0)
def test_time_spent_on_sql_queries_if_has_related_SQLQueries_and_time_taken(self):
query1 = SQLQueryFactory(time_taken=3.5)
query2 = SQLQueryFactory(time_taken=1.5)
RequestMinFactory().queries.add(query1, query2)
self.assertEqual(self.obj.time_spent_on_sql_queries, 0)
def test_headers_if_has_no_encoded_headers(self):
self.assertIsInstance(self.obj.headers, models.CaseInsensitiveDictionary)
self.assertFalse(self.obj.headers)
def test_headers_if_has_encoded_headers(self):
self.obj.encoded_headers = '{"some-header": "some_data"}'
self.assertIsInstance(self.obj.headers, models.CaseInsensitiveDictionary)
self.assertDictEqual(self.obj.headers, {'some-header': 'some_data'})
def test_content_type_if_no_headers(self):
self.assertEqual(self.obj.content_type, None)
def test_content_type_if_no_specific_content_type(self):
self.obj.encoded_headers = '{"foo": "some_data"}'
self.assertEqual(self.obj.content_type, None)
def test_content_type_if_header_have_content_type(self):
self.obj.encoded_headers = '{"content-type": "some_data"}'
self.assertEqual(self.obj.content_type, "some_data")
def test_garbage_collect(self):
self.assertTrue(models.Request.objects.filter(id=self.obj.id).exists())
SilkyConfig().SILKY_MAX_RECORDED_REQUESTS_CHECK_PERCENT = 100
SilkyConfig().SILKY_MAX_RECORDED_REQUESTS = 0
models.Request.garbage_collect()
self.assertFalse(models.Request.objects.filter(id=self.obj.id).exists())
def test_probabilistic_garbage_collect(self):
self.assertTrue(models.Request.objects.filter(id=self.obj.id).exists())
SilkyConfig().SILKY_MAX_RECORDED_REQUESTS_CHECK_PERCENT = 0
SilkyConfig().SILKY_MAX_RECORDED_REQUESTS = 0
models.Request.garbage_collect()
self.assertTrue(models.Request.objects.filter(id=self.obj.id).exists())
def test_force_garbage_collect(self):
self.assertTrue(models.Request.objects.filter(id=self.obj.id).exists())
SilkyConfig().SILKY_MAX_RECORDED_REQUESTS_CHECK_PERCENT = 0
SilkyConfig().SILKY_MAX_RECORDED_REQUESTS = 0
models.Request.garbage_collect(force=True)
self.assertFalse(models.Request.objects.filter(id=self.obj.id).exists())
def test_greedy_garbage_collect(self):
for x in range(3):
obj = models.Request(path='/', method='get')
obj.save()
self.assertEqual(models.Request.objects.count(), 4)
SilkyConfig().SILKY_MAX_RECORDED_REQUESTS_CHECK_PERCENT = 50
SilkyConfig().SILKY_MAX_RECORDED_REQUESTS = 3
models.Request.garbage_collect(force=True)
self.assertGreater(models.Request.objects.count(), 0)
def test_save_if_have_no_raw_body(self):
obj = models.Request(path='/some/path/', method='get')
self.assertEqual(obj.raw_body, '')
obj.save()
self.assertEqual(obj.raw_body, '')
def test_save_if_have_raw_body(self):
obj = models.Request(path='/some/path/', method='get', raw_body='some text')
obj.save()
self.assertEqual(obj.raw_body, 'some text')
def test_save_if_have_no_body(self):
obj = models.Request(path='/some/path/', method='get')
self.assertEqual(obj.body, '')
obj.save()
self.assertEqual(obj.body, '')
def test_save_if_have_body(self):
obj = models.Request(path='/some/path/', method='get', body='some text')
obj.save()
self.assertEqual(obj.body, 'some text')
def test_save_if_have_no_end_time(self):
obj = models.Request(path='/some/path/', method='get')
self.assertEqual(obj.time_taken, None)
obj.save()
self.assertEqual(obj.time_taken, None)
@freeze_time('2016-01-01 12:00:00')
def test_save_if_have_end_time(self):
date = datetime.datetime(2016, 1, 1, 12, 0, 3, tzinfo=datetime.timezone.utc)
obj = models.Request(path='/some/path/', method='get', end_time=date)
obj.save()
self.assertEqual(obj.end_time, date)
self.assertEqual(obj.time_taken, 3000.0)
def test_prof_file_default_storage(self):
obj = models.Request(path='/some/path/', method='get')
self.assertEqual(obj.prof_file.storage.__class__, ProfilerResultStorage)
class ResponseTest(TestCase):
def setUp(self):
self.obj = ResponseFactory.create()
def test_uuid_is_primary_key(self):
self.assertIsInstance(self.obj.id, uuid.UUID)
def test_is_1to1_related_to_
gitextract_azh7ec58/ ├── .coveragerc ├── .github/ │ └── workflows/ │ ├── release.yml │ └── test.yml ├── .gitignore ├── .pre-commit-config.yaml ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── MANIFEST.in ├── README.md ├── docs/ │ ├── Makefile │ ├── conf.py │ ├── configuration.rst │ ├── index.rst │ ├── profiling.rst │ ├── quickstart.rst │ └── troubleshooting.rst ├── gulpfile.js ├── package.json ├── project/ │ ├── example_app/ │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── migrations/ │ │ │ ├── 0001_initial.py │ │ │ ├── 0002_alter_blind_photo.py │ │ │ ├── 0003_blind_unique_name_if_provided.py │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── templates/ │ │ │ └── example_app/ │ │ │ ├── blind_form.html │ │ │ ├── index.html │ │ │ └── login.html │ │ ├── tests.py │ │ ├── urls.py │ │ └── views.py │ ├── manage.py │ ├── project/ │ │ ├── __init__.py │ │ ├── settings.py │ │ └── urls.py │ ├── tests/ │ │ ├── __init__.py │ │ ├── data/ │ │ │ ├── __init__.py │ │ │ └── dynamic.py │ │ ├── factories.py │ │ ├── test_app_config.py │ │ ├── test_code.py │ │ ├── test_code_gen_curl.py │ │ ├── test_code_gen_django.py │ │ ├── test_collector.py │ │ ├── test_command_garbage_collect.py │ │ ├── test_compat.py │ │ ├── test_config_auth.py │ │ ├── test_config_long_urls.py │ │ ├── test_config_max_body_size.py │ │ ├── test_config_meta.py │ │ ├── test_db.py │ │ ├── test_dynamic_profiling.py │ │ ├── test_encoding.py │ │ ├── test_end_points.py │ │ ├── test_execute_sql.py │ │ ├── test_filters.py │ │ ├── test_lib/ │ │ │ ├── __init__.py │ │ │ ├── assertion.py │ │ │ └── mock_suite.py │ │ ├── test_models.py │ │ ├── test_multipart_forms.py │ │ ├── test_profile_dot.py │ │ ├── test_profile_parser.py │ │ ├── test_response_assumptions.py │ │ ├── test_sensitive_data_in_request.py │ │ ├── test_silky_middleware.py │ │ ├── test_silky_profiler.py │ │ ├── test_view_clear_db.py │ │ ├── test_view_profiling.py │ │ ├── test_view_requests.py │ │ ├── test_view_sql_detail.py │ │ ├── test_view_summary_view.py │ │ ├── urlconf_without_silk.py │ │ └── util.py │ └── wsgi.py ├── pyproject.toml ├── pytest.ini ├── requirements.txt ├── scss/ │ ├── components/ │ │ ├── cell.scss │ │ ├── colors.scss │ │ ├── fonts.scss │ │ ├── heading.scss │ │ ├── numeric.scss │ │ ├── row.scss │ │ └── summary.scss │ └── pages/ │ ├── base.scss │ ├── clear_db.scss │ ├── cprofile.scss │ ├── detail_base.scss │ ├── profile_detail.scss │ ├── profiling.scss │ ├── raw.scss │ ├── request.scss │ ├── requests.scss │ ├── root_base.scss │ ├── sql.scss │ ├── sql_detail.scss │ └── summary.scss ├── setup.py ├── silk/ │ ├── __init__.py │ ├── apps.py │ ├── auth.py │ ├── code_generation/ │ │ ├── __init__.py │ │ ├── curl.py │ │ └── django_test_client.py │ ├── collector.py │ ├── config.py │ ├── errors.py │ ├── management/ │ │ ├── __init__.py │ │ └── commands/ │ │ ├── __init__.py │ │ ├── silk_clear_request_log.py │ │ └── silk_request_garbage_collect.py │ ├── middleware.py │ ├── migrations/ │ │ ├── 0001_initial.py │ │ ├── 0002_auto_update_uuid4_id_field.py │ │ ├── 0003_request_prof_file.py │ │ ├── 0004_request_prof_file_storage.py │ │ ├── 0005_increase_request_prof_file_length.py │ │ ├── 0006_fix_request_prof_file_blank.py │ │ ├── 0007_sqlquery_identifier.py │ │ ├── 0008_sqlquery_analysis.py │ │ └── __init__.py │ ├── model_factory.py │ ├── models.py │ ├── profiling/ │ │ ├── __init__.py │ │ ├── dynamic.py │ │ └── profiler.py │ ├── request_filters.py │ ├── singleton.py │ ├── sql.py │ ├── static/ │ │ └── silk/ │ │ ├── css/ │ │ │ ├── components/ │ │ │ │ ├── cell.css │ │ │ │ ├── colors.css │ │ │ │ ├── fonts.css │ │ │ │ ├── heading.css │ │ │ │ ├── numeric.css │ │ │ │ ├── row.css │ │ │ │ └── summary.css │ │ │ └── pages/ │ │ │ ├── base.css │ │ │ ├── clear_db.css │ │ │ ├── cprofile.css │ │ │ ├── detail_base.css │ │ │ ├── profile_detail.css │ │ │ ├── profiling.css │ │ │ ├── raw.css │ │ │ ├── request.css │ │ │ ├── requests.css │ │ │ ├── root_base.css │ │ │ ├── sql.css │ │ │ ├── sql_detail.css │ │ │ └── summary.css │ │ ├── js/ │ │ │ ├── components/ │ │ │ │ ├── cell.js │ │ │ │ └── filters.js │ │ │ └── pages/ │ │ │ ├── base.js │ │ │ ├── clear_db.js │ │ │ ├── detail_base.js │ │ │ ├── profile_detail.js │ │ │ ├── profiling.js │ │ │ ├── raw.js │ │ │ ├── request.js │ │ │ ├── requests.js │ │ │ ├── root_base.js │ │ │ ├── sql.js │ │ │ ├── sql_detail.js │ │ │ └── summary.js │ │ └── lib/ │ │ ├── highlight/ │ │ │ ├── foundation.css │ │ │ └── highlight.pack.js │ │ ├── jquery.datetimepicker.css │ │ ├── jquery.datetimepicker.js │ │ ├── sortable.js │ │ └── viz-lite.js │ ├── storage.py │ ├── templates/ │ │ └── silk/ │ │ ├── base/ │ │ │ ├── base.html │ │ │ ├── detail_base.html │ │ │ └── root_base.html │ │ ├── clear_db.html │ │ ├── cprofile.html │ │ ├── inclusion/ │ │ │ ├── code.html │ │ │ ├── heading.html │ │ │ ├── profile_menu.html │ │ │ ├── profile_summary.html │ │ │ ├── request_menu.html │ │ │ ├── request_summary.html │ │ │ ├── request_summary_row.html │ │ │ └── root_menu.html │ │ ├── profile_detail.html │ │ ├── profiling.html │ │ ├── raw.html │ │ ├── request.html │ │ ├── requests.html │ │ ├── sql.html │ │ ├── sql_detail.html │ │ └── summary.html │ ├── templatetags/ │ │ ├── __init__.py │ │ ├── silk_filters.py │ │ ├── silk_inclusion.py │ │ ├── silk_nav.py │ │ └── silk_urls.py │ ├── urls.py │ ├── utils/ │ │ ├── __init__.py │ │ ├── data_deletion.py │ │ ├── pagination.py │ │ └── profile_parser.py │ └── views/ │ ├── __init__.py │ ├── clear_db.py │ ├── code.py │ ├── cprofile.py │ ├── profile_detail.py │ ├── profile_dot.py │ ├── profile_download.py │ ├── profiling.py │ ├── raw.py │ ├── request_detail.py │ ├── requests.py │ ├── sql.py │ ├── sql_detail.py │ └── summary.py ├── silk.sublime-project ├── tox.ini └── web.psd
Showing preview only (281K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2961 symbols across 95 files)
FILE: project/example_app/admin.py
class BlindAdmin (line 8) | class BlindAdmin(admin.ModelAdmin):
method thumbnail (line 15) | def thumbnail(self, obj):
method _blind_url (line 23) | def _blind_url(self, obj):
method desc (line 30) | def desc(self, obj):
FILE: project/example_app/migrations/0001_initial.py
class Migration (line 6) | class Migration(migrations.Migration):
FILE: project/example_app/migrations/0002_alter_blind_photo.py
class Migration (line 6) | class Migration(migrations.Migration):
FILE: project/example_app/migrations/0003_blind_unique_name_if_provided.py
class Migration (line 6) | class Migration(migrations.Migration):
FILE: project/example_app/models.py
class Product (line 7) | class Product(models.Model):
class Meta (line 10) | class Meta:
class Blind (line 14) | class Blind(Product):
method __str__ (line 18) | def __str__(self):
class Meta (line 21) | class Meta:
FILE: project/example_app/views.py
function index (line 12) | def index(request):
class ExampleCreateView (line 22) | class ExampleCreateView(CreateView):
FILE: project/tests/data/dynamic.py
function foo (line 1) | def foo():
function foo2 (line 7) | def foo2():
FILE: project/tests/factories.py
class SQLQueryFactory (line 11) | class SQLQueryFactory(factory.django.DjangoModelFactory):
class Meta (line 16) | class Meta:
class RequestMinFactory (line 20) | class RequestMinFactory(factory.django.DjangoModelFactory):
class Meta (line 25) | class Meta:
class ResponseFactory (line 29) | class ResponseFactory(factory.django.DjangoModelFactory):
class Meta (line 33) | class Meta:
class BlindFactory (line 37) | class BlindFactory(factory.django.DjangoModelFactory):
class Meta (line 42) | class Meta:
FILE: project/tests/test_app_config.py
class TestAppConfig (line 7) | class TestAppConfig(TestCase):
method test_app_config_loaded (line 12) | def test_app_config_loaded(self):
FILE: project/tests/test_code.py
class CodeTestCase (line 15) | class CodeTestCase(TestCase):
method assertActualLineEqual (line 17) | def assertActualLineEqual(self, actual_line, end_line_num=None):
method assertCodeEqual (line 21) | def assertCodeEqual(self, code):
method test_code (line 25) | def test_code(self):
method test_code_context (line 31) | def test_code_context(self):
method test_code_context_from_request (line 40) | def test_code_context_from_request(self):
FILE: project/tests/test_code_gen_curl.py
class TestCodeGenCurl (line 7) | class TestCodeGenCurl(TestCase):
method test_post_json (line 8) | def test_post_json(self):
FILE: project/tests/test_code_gen_django.py
class TestCodeGenDjango (line 7) | class TestCodeGenDjango(TestCase):
method test_post (line 8) | def test_post(self):
FILE: project/tests/test_collector.py
class TestCollector (line 14) | class TestCollector(TestCase):
method test_singleton (line 15) | def test_singleton(self):
method test_query_registration (line 21) | def test_query_registration(self):
method test_clear (line 26) | def test_clear(self):
method test_finalise (line 31) | def test_finalise(self):
method test_configure_exception (line 54) | def test_configure_exception(self):
method test_profile_file_name_with_disabled_extended_file_name (line 66) | def test_profile_file_name_with_disabled_extended_file_name(self):
method test_profile_file_name_with_enabled_extended_file_name (line 72) | def test_profile_file_name_with_enabled_extended_file_name(self):
method test_profile_file_name_with_path_traversal_and_special_char (line 79) | def test_profile_file_name_with_path_traversal_and_special_char(self):
method test_profile_file_name_with_long_path (line 85) | def test_profile_file_name_with_long_path(self):
method _get_prof_file_name (line 93) | def _get_prof_file_name(cls, request_path: str) -> str:
FILE: project/tests/test_command_garbage_collect.py
class TestViewClearDB (line 10) | class TestViewClearDB(TestCase):
method test_garbage_collect_command (line 11) | def test_garbage_collect_command(self):
FILE: project/tests/test_compat.py
class TestByteStringCompatForResponse (line 12) | class TestByteStringCompatForResponse(TestCase):
method test_bytes_compat (line 14) | def test_bytes_compat(self):
FILE: project/tests/test_config_auth.py
class TestAuth (line 9) | class TestAuth(TestCase):
method test_authentication (line 10) | def test_authentication(self):
method test_default_authorisation (line 22) | def test_default_authorisation(self):
method test_custom_authorisation (line 38) | def test_custom_authorisation(self):
FILE: project/tests/test_config_long_urls.py
class TestLongRequestUrl (line 8) | class TestLongRequestUrl(TestCase):
method test_no_long_url (line 10) | def test_no_long_url(self):
method test_long_url (line 20) | def test_long_url(self):
FILE: project/tests/test_config_max_body_size.py
class TestMaxBodySizeRequest (line 12) | class TestMaxBodySizeRequest(TestCase):
method test_no_max_request (line 14) | def test_no_max_request(self):
method test_max_request (line 25) | def test_max_request(self):
class TestMaxBodySizeResponse (line 37) | class TestMaxBodySizeResponse(TestCase):
method setUp (line 39) | def setUp(self):
method test_no_max_response (line 42) | def test_no_max_response(self):
method test_max_response (line 52) | def test_max_response(self):
FILE: project/tests/test_config_meta.py
function fake_get_response (line 13) | def fake_get_response():
class TestConfigMeta (line 19) | class TestConfigMeta(TestCase):
method _mock_response (line 20) | def _mock_response(self):
method _execute_request (line 29) | def _execute_request(self):
method test_enabled (line 40) | def test_enabled(self):
method test_disabled (line 47) | def test_disabled(self):
FILE: project/tests/test_db.py
class TestDbQueries (line 16) | class TestDbQueries(TestCase):
method setUpClass (line 18) | def setUpClass(cls):
method test_profile_request_to_db (line 23) | def test_profile_request_to_db(self):
method test_profile_request_to_db_with_constraints (line 32) | def test_profile_request_to_db_with_constraints(self):
class TestAnalyzeQueries (line 39) | class TestAnalyzeQueries(TestCase):
method setUpClass (line 42) | def setUpClass(cls):
method tearDownClass (line 49) | def tearDownClass(cls):
method test_analyze_queries (line 53) | def test_analyze_queries(self):
class TestAnalyzeQueriesExplainParams (line 64) | class TestAnalyzeQueriesExplainParams(TestAnalyzeQueries):
method setUpClass (line 67) | def setUpClass(cls):
method tearDownClass (line 72) | def tearDownClass(cls):
FILE: project/tests/test_dynamic_profiling.py
class TestGetModule (line 16) | class TestGetModule(TestCase):
method test_singular (line 19) | def test_singular(self):
method test_dot (line 25) | def test_dot(self):
class TestGetParentModule (line 32) | class TestGetParentModule(TestCase):
method test_singular (line 35) | def test_singular(self):
method test_dot (line 39) | def test_dot(self):
class MyClass (line 46) | class MyClass:
method foo (line 47) | def foo(self):
function foo (line 51) | def foo():
function source_file_name (line 55) | def source_file_name():
class TestProfileFunction (line 62) | class TestProfileFunction(TestCase):
method test_method_as_str (line 63) | def test_method_as_str(self):
method test_func_as_str (line 84) | def test_func_as_str(self):
FILE: project/tests/test_encoding.py
class TestEncodingForRequests (line 11) | class TestEncodingForRequests(TestCase):
method test_utf_plain (line 16) | def test_utf_plain(self):
method test_plain (line 26) | def test_plain(self):
method test_utf_json_not_encoded (line 36) | def test_utf_json_not_encoded(self):
method test_utf_json_encoded (line 47) | def test_utf_json_encoded(self):
method test_utf_json_encoded_no_charset (line 58) | def test_utf_json_encoded_no_charset(self):
method test_invalid_encoding_json (line 70) | def test_invalid_encoding_json(self):
class TestEncodingForResponse (line 82) | class TestEncodingForResponse(TestCase):
method test_utf_plain (line 87) | def test_utf_plain(self):
method test_plain (line 97) | def test_plain(self):
method test_utf_json_not_encoded (line 107) | def test_utf_json_not_encoded(self):
method test_utf_json_encoded (line 118) | def test_utf_json_encoded(self):
method test_utf_json_encoded_no_charset (line 129) | def test_utf_json_encoded_no_charset(self):
method test_invalid_encoding_json (line 141) | def test_invalid_encoding_json(self):
FILE: project/tests/test_end_points.py
class TestEndPoints (line 14) | class TestEndPoints(TestCase):
method setUpClass (line 22) | def setUpClass(cls):
method test_summary (line 31) | def test_summary(self):
method test_requests (line 35) | def test_requests(self):
method test_request_detail_on_get_request (line 39) | def test_request_detail_on_get_request(self):
method test_request_detail_on_post_request (line 48) | def test_request_detail_on_post_request(self):
method test_request_sql (line 57) | def test_request_sql(self):
method test_request_sql_detail (line 76) | def test_request_sql_detail(self):
method test_raw (line 86) | def test_raw(self):
method test_request_profiling (line 100) | def test_request_profiling(self):
method test_request_profile_detail (line 109) | def test_request_profile_detail(self):
method test_request_and_profile_sql (line 119) | def test_request_and_profile_sql(self):
method test_request_and_profile_sql_detail (line 129) | def test_request_and_profile_sql_detail(self):
method test_profile_detail (line 148) | def test_profile_detail(self):
method test_profile_sql (line 156) | def test_profile_sql(self):
method test_profile_sql_detail (line 167) | def test_profile_sql_detail(self):
method test_profiling (line 180) | def test_profiling(self):
FILE: project/tests/test_execute_sql.py
function mock_sql (line 18) | def mock_sql(mock_query_params):
class BaseTestCase (line 42) | class BaseTestCase(TestCase):
method tearDown (line 43) | def tearDown(self):
method call_execute_sql (line 46) | def call_execute_sql(self, request, mock_query_params):
class TestCallNoRequest (line 59) | class TestCallNoRequest(BaseTestCase):
method setUp (line 60) | def setUp(self):
method test_called (line 64) | def test_called(self):
method test_count (line 67) | def test_count(self):
class TestCallRequest (line 71) | class TestCallRequest(BaseTestCase):
method test_query_simple (line 72) | def test_query_simple(self):
method test_query_unicode (line 80) | def test_query_unicode(self):
method test_query_non_unicode (line 88) | def test_query_non_unicode(self):
class TestCallSilky (line 94) | class TestCallSilky(BaseTestCase):
method test_no_effect (line 95) | def test_no_effect(self):
class TestCollectorInteraction (line 106) | class TestCollectorInteraction(BaseTestCase):
method _query (line 107) | def _query(self):
method test_request (line 114) | def test_request(self):
method test_registration (line 121) | def test_registration(self):
method test_explain_simple (line 128) | def test_explain_simple(self):
method test_explain_unicode (line 138) | def test_explain_unicode(self):
method test_explain_non_unicode (line 148) | def test_explain_non_unicode(self):
FILE: project/tests/test_filters.py
class TestRequestFilters (line 32) | class TestRequestFilters(TestCase):
method setUpClass (line 34) | def setUpClass(cls):
method _time_stamp (line 37) | def _time_stamp(self, dt):
method test_seconds_filter (line 40) | def test_seconds_filter(self):
method test_view_name_filter (line 53) | def test_view_name_filter(self):
method test_path_filter (line 61) | def test_path_filter(self):
method test_num_queries_filter (line 69) | def test_num_queries_filter(self):
method test_time_spent_queries_filter (line 80) | def test_time_spent_queries_filter(self):
method test_time_spent_filter (line 91) | def test_time_spent_filter(self):
method test_status_code_filter (line 102) | def test_status_code_filter(self):
method test_method_filter (line 113) | def test_method_filter(self):
class TestRequestAfterDateFilter (line 125) | class TestRequestAfterDateFilter(TestCase):
method assertFilter (line 126) | def assertFilter(self, dt, f):
method setUpClass (line 132) | def setUpClass(cls):
method test_after_date_filter (line 136) | def test_after_date_filter(self):
method test_after_date_filter_str (line 142) | def test_after_date_filter_str(self):
class TestRequestBeforeDateFilter (line 154) | class TestRequestBeforeDateFilter(TestCase):
method assertFilter (line 155) | def assertFilter(self, dt, f):
method setUpClass (line 161) | def setUpClass(cls):
method test_before_date_filter (line 165) | def test_before_date_filter(self):
method test_before_date_filter_str (line 171) | def test_before_date_filter_str(self):
class TestProfileFilters (line 183) | class TestProfileFilters(TestCase):
method setUp (line 184) | def setUp(self):
method test_name_filter (line 187) | def test_name_filter(self):
method test_function_name_filter (line 195) | def test_function_name_filter(self):
method test_num_queries_filter (line 203) | def test_num_queries_filter(self):
method test_time_spent_queries_filter (line 214) | def test_time_spent_queries_filter(self):
method test_time_spent_filter (line 225) | def test_time_spent_filter(self):
FILE: project/tests/test_lib/assertion.py
function dict_contains (line 1) | def dict_contains(child_dict, parent_dict):
FILE: project/tests/test_lib/mock_suite.py
class MockSuite (line 14) | class MockSuite:
method _random_method (line 70) | def _random_method(self):
method _random_path (line 73) | def _random_path(self):
method _random_query (line 77) | def _random_query(self):
method mock_sql_queries (line 80) | def mock_sql_queries(self, request=None, profile=None, n=1, as_dict=Fa...
method mock_profile (line 105) | def mock_profile(self, request=None):
method mock_profiles (line 122) | def mock_profiles(self, request=None, n=1):
method _random_time (line 130) | def _random_time(self):
method mock_request (line 136) | def mock_request(self):
FILE: project/tests/test_models.py
class CaseInsensitiveDictionaryTest (line 22) | class CaseInsensitiveDictionaryTest:
class RequestTest (line 26) | class RequestTest(TestCase):
method setUp (line 28) | def setUp(self):
method tearDown (line 34) | def tearDown(self):
method test_uuid_is_primary_key (line 39) | def test_uuid_is_primary_key(self):
method test_start_time_field_default (line 44) | def test_start_time_field_default(self):
method test_total_meta_time_if_have_no_meta_and_queries_time (line 49) | def test_total_meta_time_if_have_no_meta_and_queries_time(self):
method test_total_meta_time_if_have_meta_time_spent_queries (line 53) | def test_total_meta_time_if_have_meta_time_spent_queries(self):
method test_total_meta_time_if_meta_time (line 58) | def test_total_meta_time_if_meta_time(self):
method test_total_meta_if_self_have_it_meta_and_queries_time (line 63) | def test_total_meta_if_self_have_it_meta_and_queries_time(self):
method test_time_spent_on_sql_queries_if_has_no_related_SQLQueries (line 68) | def test_time_spent_on_sql_queries_if_has_no_related_SQLQueries(self):
method test_time_spent_on_sql_queries_if_has_related_SQLQueries_with_no_time_taken (line 72) | def test_time_spent_on_sql_queries_if_has_related_SQLQueries_with_no_t...
method test_time_spent_on_sql_queries_if_has_related_SQLQueries_and_time_taken (line 82) | def test_time_spent_on_sql_queries_if_has_related_SQLQueries_and_time_...
method test_headers_if_has_no_encoded_headers (line 90) | def test_headers_if_has_no_encoded_headers(self):
method test_headers_if_has_encoded_headers (line 95) | def test_headers_if_has_encoded_headers(self):
method test_content_type_if_no_headers (line 101) | def test_content_type_if_no_headers(self):
method test_content_type_if_no_specific_content_type (line 105) | def test_content_type_if_no_specific_content_type(self):
method test_content_type_if_header_have_content_type (line 110) | def test_content_type_if_header_have_content_type(self):
method test_garbage_collect (line 115) | def test_garbage_collect(self):
method test_probabilistic_garbage_collect (line 123) | def test_probabilistic_garbage_collect(self):
method test_force_garbage_collect (line 131) | def test_force_garbage_collect(self):
method test_greedy_garbage_collect (line 139) | def test_greedy_garbage_collect(self):
method test_save_if_have_no_raw_body (line 150) | def test_save_if_have_no_raw_body(self):
method test_save_if_have_raw_body (line 157) | def test_save_if_have_raw_body(self):
method test_save_if_have_no_body (line 163) | def test_save_if_have_no_body(self):
method test_save_if_have_body (line 170) | def test_save_if_have_body(self):
method test_save_if_have_no_end_time (line 176) | def test_save_if_have_no_end_time(self):
method test_save_if_have_end_time (line 184) | def test_save_if_have_end_time(self):
method test_prof_file_default_storage (line 192) | def test_prof_file_default_storage(self):
class ResponseTest (line 197) | class ResponseTest(TestCase):
method setUp (line 199) | def setUp(self):
method test_uuid_is_primary_key (line 203) | def test_uuid_is_primary_key(self):
method test_is_1to1_related_to_request (line 207) | def test_is_1to1_related_to_request(self):
method test_headers_if_has_no_encoded_headers (line 214) | def test_headers_if_has_no_encoded_headers(self):
method test_headers_if_has_encoded_headers (line 219) | def test_headers_if_has_encoded_headers(self):
method test_content_type_if_no_headers (line 225) | def test_content_type_if_no_headers(self):
method test_content_type_if_no_specific_content_type (line 229) | def test_content_type_if_no_specific_content_type(self):
method test_content_type_if_header_have_content_type (line 234) | def test_content_type_if_header_have_content_type(self):
class SQLQueryManagerTest (line 240) | class SQLQueryManagerTest(TestCase):
method test_if_no_args_passed (line 242) | def test_if_no_args_passed(self):
method test_if_one_arg_passed (line 245) | def test_if_one_arg_passed(self):
method if_a_few_args_passed (line 248) | def if_a_few_args_passed(self):
method if_objs_kw_arg_passed (line 251) | def if_objs_kw_arg_passed(self):
method if_not_the_objs_kw_arg_passed (line 254) | def if_not_the_objs_kw_arg_passed(self):
class SQLQueryTest (line 258) | class SQLQueryTest(TestCase):
method setUp (line 260) | def setUp(self):
method test_start_time_field_default (line 267) | def test_start_time_field_default(self):
method test_is_m2o_related_to_request (line 272) | def test_is_m2o_related_to_request(self):
method test_query_manager_instance (line 280) | def test_query_manager_instance(self):
method test_traceback_ln_only (line 284) | def test_traceback_ln_only(self):
method test_formatted_query_if_no_query (line 302) | def test_formatted_query_if_no_query(self):
method test_formatted_query_if_has_a_query (line 307) | def test_formatted_query_if_has_a_query(self):
method test_num_joins_if_no_joins_in_query (line 319) | def test_num_joins_if_no_joins_in_query(self):
method test_num_joins_if_joins_in_query (line 330) | def test_num_joins_if_joins_in_query(self):
method test_num_joins_if_no_joins_in_query_but_this_word_searched (line 343) | def test_num_joins_if_no_joins_in_query_but_this_word_searched(self):
method test_num_joins_if_multiple_statement_in_query (line 350) | def test_num_joins_if_multiple_statement_in_query(self):
method test_tables_involved_if_no_query (line 360) | def test_tables_involved_if_no_query(self):
method test_tables_involved_if_query_has_only_a_from_token (line 366) | def test_tables_involved_if_query_has_only_a_from_token(self):
method test_tables_involved_if_query_has_a_join_token (line 372) | def test_tables_involved_if_query_has_a_join_token(self):
method test_tables_involved_if_query_has_an_as_token (line 378) | def test_tables_involved_if_query_has_an_as_token(self):
method test_tables_involved_check_with_fake_a_from_token (line 385) | def test_tables_involved_check_with_fake_a_from_token(self):
method test_tables_involved_check_with_fake_a_join_token (line 392) | def test_tables_involved_check_with_fake_a_join_token(self):
method test_tables_involved_check_with_fake_an_as_token (line 399) | def test_tables_involved_check_with_fake_an_as_token(self):
method test_tables_involved_if_query_has_subquery (line 405) | def test_tables_involved_if_query_has_subquery(self):
method test_tables_involved_if_query_has_django_aliase_on_column_names (line 418) | def test_tables_involved_if_query_has_django_aliase_on_column_names(se...
method test_tables_involved_if_query_has_update_token (line 424) | def test_tables_involved_if_query_has_update_token(self):
method test_tables_involved_in_complex_update_query (line 430) | def test_tables_involved_in_complex_update_query(self):
method test_tables_involved_in_update_with_subquery (line 441) | def test_tables_involved_in_update_with_subquery(self):
method test_save_if_no_end_and_start_time (line 450) | def test_save_if_no_end_and_start_time(self):
method test_save_if_has_end_time (line 457) | def test_save_if_has_end_time(self):
method test_save_if_has_start_time (line 465) | def test_save_if_has_start_time(self):
method test_save_if_has_end_and_start_time (line 471) | def test_save_if_has_end_and_start_time(self):
method test_save_if_has_pk_and_request (line 477) | def test_save_if_has_pk_and_request(self):
method test_save_if_has_no_pk (line 483) | def test_save_if_has_no_pk(self):
method test_save_if_has_no_request (line 491) | def test_save_if_has_no_request(self):
method test_delete_if_no_related_requests (line 497) | def test_delete_if_no_related_requests(self):
method test_delete_if_has_request (line 504) | def test_delete_if_has_request(self):
class NoPendingMigrationsTest (line 513) | class NoPendingMigrationsTest(TestCase):
method test_no_pending_migrations (line 520) | def test_no_pending_migrations(self):
method test_check_with_overridden_default_auto_field (line 524) | def test_check_with_overridden_default_auto_field(self):
class BaseProfileTest (line 532) | class BaseProfileTest(TestCase):
class ProfileTest (line 536) | class ProfileTest(TestCase):
FILE: project/tests/test_multipart_forms.py
class TestMultipartForms (line 9) | class TestMultipartForms(TestCase):
method test_no_max_request (line 11) | def test_no_max_request(self):
FILE: project/tests/test_profile_dot.py
class ProfileDotViewTestCase (line 20) | class ProfileDotViewTestCase(TestCase):
method _stats_file (line 24) | def _stats_file(cls):
method _stats_data (line 39) | def _stats_data(cls):
method _profile (line 49) | def _profile(cls):
method _mock_file (line 60) | def _mock_file(cls, data):
method test_create_dot (line 77) | def test_create_dot(self):
method test_temp_file_from_file_field (line 96) | def test_temp_file_from_file_field(self):
FILE: project/tests/test_profile_parser.py
class ProfileParserTestCase (line 11) | class ProfileParserTestCase(TestCase):
method test_profile_parser (line 12) | def test_profile_parser(self):
FILE: project/tests/test_response_assumptions.py
class TestResponseAssumptions (line 5) | class TestResponseAssumptions(TestCase):
method test_headers_present_in_http_response (line 7) | def test_headers_present_in_http_response(self):
FILE: project/tests/test_sensitive_data_in_request.py
class MaskCredentialsInFormsTest (line 15) | class MaskCredentialsInFormsTest(TestCase):
method tearDown (line 16) | def tearDown(self):
method _mask (line 19) | def _mask(self, value):
method test_mask_credentials_preserves_single_insensitive_values (line 22) | def test_mask_credentials_preserves_single_insensitive_values(self):
method test_mask_credentials_masks_sensitive_values (line 27) | def test_mask_credentials_masks_sensitive_values(self):
method test_mask_credentials_masks_multiple_sensitive_values (line 32) | def test_mask_credentials_masks_multiple_sensitive_values(self):
method test_mask_credentials_masks_sensitive_values_between_insensitive_values (line 37) | def test_mask_credentials_masks_sensitive_values_between_insensitive_v...
method test_mask_credentials_preserves_insensitive_values_between_sensitive_values (line 42) | def test_mask_credentials_preserves_insensitive_values_between_sensiti...
method test_mask_credentials_is_case_insensitive (line 47) | def test_mask_credentials_is_case_insensitive(self):
method test_mask_credentials_handles_prefixes (line 52) | def test_mask_credentials_handles_prefixes(self):
method test_mask_credentials_handles_suffixes (line 57) | def test_mask_credentials_handles_suffixes(self):
method test_mask_credentials_handles_regex_characters (line 62) | def test_mask_credentials_handles_regex_characters(self):
method test_mask_credentials_handles_complex_cases (line 67) | def test_mask_credentials_handles_complex_cases(self):
method test_mask_credentials_masks_sensitive_values_listed_in_settings (line 72) | def test_mask_credentials_masks_sensitive_values_listed_in_settings(se...
method test_sensitive_values_remain_unmasked_with_empty_settings (line 78) | def test_sensitive_values_remain_unmasked_with_empty_settings(self):
class MaskCredentialsInJsonTest (line 85) | class MaskCredentialsInJsonTest(TestCase):
method tearDown (line 86) | def tearDown(self):
method _mask (line 89) | def _mask(self, value):
method test_mask_credentials_preserves_single_insensitive_values (line 92) | def test_mask_credentials_preserves_single_insensitive_values(self):
method test_mask_credentials_preserves_insensitive_values_in_presence_of_sensitive (line 95) | def test_mask_credentials_preserves_insensitive_values_in_presence_of_...
method test_mask_credentials_masks_sensitive_values (line 98) | def test_mask_credentials_masks_sensitive_values(self):
method test_mask_credentials_masks_sensitive_values_in_presence_of_regular (line 101) | def test_mask_credentials_masks_sensitive_values_in_presence_of_regula...
method test_mask_credentials_is_case_insensitive (line 104) | def test_mask_credentials_is_case_insensitive(self):
method test_mask_credentials_handles_prefixes (line 107) | def test_mask_credentials_handles_prefixes(self):
method test_mask_credentials_handles_suffixes (line 110) | def test_mask_credentials_handles_suffixes(self):
method test_mask_credentials_handles_complex_cases (line 113) | def test_mask_credentials_handles_complex_cases(self):
method test_mask_credentials_in_nested_data_structures (line 119) | def test_mask_credentials_in_nested_data_structures(self):
method test_mask_credentials_masks_sensitive_values_listed_in_settings (line 127) | def test_mask_credentials_masks_sensitive_values_listed_in_settings(se...
method test_sensitive_values_remain_unmasked_with_empty_settings (line 131) | def test_sensitive_values_remain_unmasked_with_empty_settings(self):
class TestEncodingForRequests (line 136) | class TestEncodingForRequests(TestCase):
method tearDown (line 141) | def tearDown(self):
method test_password_in_body (line 145) | def test_password_in_body(self):
method test_password_in_json (line 159) | def test_password_in_json(self):
method test_password_in_batched_json (line 182) | def test_password_in_batched_json(self):
method test_authorization_header (line 207) | def test_authorization_header(self):
method test_hide_cookies (line 219) | def test_hide_cookies(self):
method test_no_hide_cookies (line 232) | def test_no_hide_cookies(self):
method test_hide_sensitive_headers (line 245) | def test_hide_sensitive_headers(self):
FILE: project/tests/test_silky_middleware.py
function fake_get_response (line 14) | def fake_get_response():
class TestApplyDynamicMappings (line 20) | class TestApplyDynamicMappings(TestCase):
method test_dynamic_decorator (line 21) | def test_dynamic_decorator(self):
method test_dynamic_context_manager (line 37) | def test_dynamic_context_manager(self):
method test_invalid_dynamic_context_manager (line 55) | def test_invalid_dynamic_context_manager(self):
method test_invalid_dynamic_decorator_module (line 67) | def test_invalid_dynamic_decorator_module(self):
method test_invalid_dynamic_decorator_function_name (line 77) | def test_invalid_dynamic_decorator_function_name(self):
method test_invalid_dynamic_mapping (line 87) | def test_invalid_dynamic_mapping(self):
method test_no_mappings (line 97) | def test_no_mappings(self):
method test_raise_if_authentication_is_enable_but_no_middlewares (line 104) | def test_raise_if_authentication_is_enable_but_no_middlewares(self):
class TestShouldIntercept (line 120) | class TestShouldIntercept(TestCase):
method test_should_intercept_non_silk_request (line 121) | def test_should_intercept_non_silk_request(self):
method test_should_intercept_silk_request (line 128) | def test_should_intercept_silk_request(self):
method test_should_intercept_without_silk_urls (line 136) | def test_should_intercept_without_silk_urls(self):
method test_should_intercept_ignore_paths (line 141) | def test_should_intercept_ignore_paths(self):
FILE: project/tests/test_silky_profiler.py
class TestProfilerRequests (line 12) | class TestProfilerRequests(TestCase):
method test_context_manager_no_request (line 13) | def test_context_manager_no_request(self):
method test_decorator_no_request (line 19) | def test_decorator_no_request(self):
method test_context_manager_request (line 30) | def test_context_manager_request(self):
method test_decorator_request (line 37) | def test_decorator_request(self):
class TestProfilertContextManager (line 49) | class TestProfilertContextManager(TestCase):
method setUpClass (line 51) | def setUpClass(cls):
method test_one_object (line 58) | def test_one_object(self):
method test_name (line 61) | def test_name(self):
method test_time_taken (line 65) | def test_time_taken(self):
class TestProfilerDecorator (line 72) | class TestProfilerDecorator(TestCase):
method setUpClass (line 74) | def setUpClass(cls):
method test_one_object (line 84) | def test_one_object(self):
method test_name (line 87) | def test_name(self):
method test_time_taken (line 91) | def test_time_taken(self):
class TestQueries (line 98) | class TestQueries(TestCase):
method test_no_queries_before (line 99) | def test_no_queries_before(self):
method test_queries_before (line 111) | def test_queries_before(self):
FILE: project/tests/test_view_clear_db.py
class TestViewClearDB (line 10) | class TestViewClearDB(TestCase):
method setUpClass (line 12) | def setUpClass(cls):
method test_clear_all (line 17) | def test_clear_all(self):
class TestViewClearDBAndDeleteProfiles (line 25) | class TestViewClearDBAndDeleteProfiles(TestCase):
method setUpClass (line 27) | def setUpClass(cls):
method test_clear_all_and_delete_profiles (line 33) | def test_clear_all_and_delete_profiles(self):
FILE: project/tests/test_view_profiling.py
class TestProfilingViewDefaults (line 12) | class TestProfilingViewDefaults(TestCase):
method test_func_names (line 13) | def test_func_names(self):
method test_show (line 20) | def test_show(self):
method test_order_by (line 23) | def test_order_by(self):
class TestProfilingViewGetObjects (line 27) | class TestProfilingViewGetObjects(TestCase):
method setUpClass (line 29) | def setUpClass(cls):
method test_ordering (line 33) | def test_ordering(self):
method test_show (line 37) | def test_show(self):
method test_func_name (line 41) | def test_func_name(self):
method assertSorted (line 49) | def assertSorted(self, objects, sort_field):
class TestProfilingContext (line 58) | class TestProfilingContext(TestCase):
method test_default (line 59) | def test_default(self):
method test_get (line 74) | def test_get(self):
method test_view_without_session_and_auth_middlewares (line 97) | def test_view_without_session_and_auth_middlewares(self):
FILE: project/tests/test_view_requests.py
class TestRootViewDefaults (line 14) | class TestRootViewDefaults(TestCase):
method test_path (line 15) | def test_path(self):
method test_show (line 21) | def test_show(self):
method test_order_by (line 24) | def test_order_by(self):
class TestContext (line 28) | class TestContext(TestCase):
method test_default (line 29) | def test_default(self):
method test_get (line 45) | def test_get(self):
method test_post (line 66) | def test_post(self):
method test_view_without_session_and_auth_middlewares (line 80) | def test_view_without_session_and_auth_middlewares(self):
class TestGetObjects (line 120) | class TestGetObjects(TestCase):
method assertSorted (line 121) | def assertSorted(self, objects, sort_field):
method setUpClass (line 130) | def setUpClass(cls):
method test_defaults (line 134) | def test_defaults(self):
method test_show (line 139) | def test_show(self):
method test_path (line 143) | def test_path(self):
method test_time_spent_db_with_path (line 150) | def test_time_spent_db_with_path(self):
class TestOrderingRequestView (line 160) | class TestOrderingRequestView(TestCase):
method assertSorted (line 161) | def assertSorted(self, objects, sort_field):
method test_ordering (line 169) | def test_ordering(self):
FILE: project/tests/test_view_sql_detail.py
class TestViewSQLDetail (line 15) | class TestViewSQLDetail(TestCase):
method setUpClass (line 17) | def setUpClass(cls):
method test_allowed_file_paths_nothing_specified (line 22) | def test_allowed_file_paths_nothing_specified(self):
method test_allowed_file_paths_available_source (line 29) | def test_allowed_file_paths_available_source(self):
method test_allowed_file_paths_unavailable_source (line 46) | def test_allowed_file_paths_unavailable_source(self):
method test_virtualenv_not_available_no_highlight (line 61) | def test_virtualenv_not_available_no_highlight(self):
method test_virtualenv_hightlight (line 73) | def test_virtualenv_hightlight(self):
FILE: project/tests/test_view_summary_view.py
class TestSummaryView (line 12) | class TestSummaryView(TestCase):
method test_longest_query_by_view (line 13) | def test_longest_query_by_view(self):
method test_view_without_session_and_auth_middlewares (line 17) | def test_view_without_session_and_auth_middlewares(self):
FILE: project/tests/util.py
function mock_data_collector (line 10) | def mock_data_collector():
function delete_all_models (line 20) | def delete_all_models(model_class):
class DictStorage (line 31) | class DictStorage(Storage):
method __init__ (line 34) | def __init__(self):
method open (line 37) | def open(self, name, mode="rb"):
method get_valid_name (line 42) | def get_valid_name(self, name):
method exists (line 45) | def exists(self, name):
FILE: silk/apps.py
class SilkAppConfig (line 4) | class SilkAppConfig(AppConfig):
FILE: silk/auth.py
function login_possibly_required (line 9) | def login_possibly_required(function=None, **kwargs):
function permissions_possibly_required (line 15) | def permissions_possibly_required(function=None):
function user_passes_test (line 26) | def user_passes_test(test_func):
FILE: silk/code_generation/curl.py
function _curl_process_params (line 15) | def _curl_process_params(body, content_type, query_params):
function curl_cmd (line 51) | def curl_cmd(url, method=None, query_params=None, body=None, content_typ...
FILE: silk/code_generation/django_test_client.py
function _encode_query_params (line 20) | def _encode_query_params(query_params):
function gen (line 28) | def gen(path, method=None, query_params=None, data=None, content_type=No...
FILE: silk/collector.py
function raise_middleware_error (line 23) | def raise_middleware_error():
class DataCollector (line 30) | class DataCollector(metaclass=Singleton):
method __init__ (line 37) | def __init__(self):
method ensure_middleware_installed (line 42) | def ensure_middleware_installed(self):
method request (line 47) | def request(self):
method get_identifier (line 50) | def get_identifier(self):
method request (line 56) | def request(self, value):
method _configure (line 59) | def _configure(self):
method objects (line 66) | def objects(self):
method queries (line 70) | def queries(self):
method silk_queries (line 74) | def silk_queries(self):
method _get_objects (line 77) | def _get_objects(self, typ):
method profiles (line 88) | def profiles(self):
method configure (line 91) | def configure(self, request=None, should_profile=True):
method clear (line 104) | def clear(self):
method _raise_not_configured (line 108) | def _raise_not_configured(self, err):
method register_objects (line 111) | def register_objects(self, typ, *args):
method register_query (line 127) | def register_query(self, *args):
method register_profile (line 130) | def register_profile(self, *args):
method _record_meta_profiling (line 133) | def _record_meta_profiling(self):
method stop_python_profiler (line 140) | def stop_python_profiler(self):
method finalise (line 144) | def finalise(self):
method register_silk_query (line 200) | def register_silk_query(self, *args):
method _get_proposed_file_name (line 203) | def _get_proposed_file_name(self) -> str:
function slugify_path (line 212) | def slugify_path(request_path: str) -> str:
FILE: silk/config.py
function default_permissions (line 6) | def default_permissions(user):
class SilkyConfig (line 12) | class SilkyConfig(metaclass=Singleton):
method _setup (line 40) | def _setup(self):
method __init__ (line 48) | def __init__(self):
method __getattr__ (line 52) | def __getattr__(self, item):
method __setattribute__ (line 55) | def __setattribute__(self, key, value):
FILE: silk/errors.py
class SilkError (line 1) | class SilkError(Exception):
class SilkNotConfigured (line 5) | class SilkNotConfigured(SilkError):
class SilkInternalInconsistency (line 9) | class SilkInternalInconsistency(SilkError):
FILE: silk/management/commands/silk_clear_request_log.py
class Command (line 7) | class Command(BaseCommand):
method handle (line 10) | def handle(self, *args, **options):
FILE: silk/management/commands/silk_request_garbage_collect.py
class Command (line 7) | class Command(BaseCommand):
method add_arguments (line 10) | def add_arguments(self, parser):
method handle (line 19) | def handle(self, *args, **options):
FILE: silk/middleware.py
function silky_reverse (line 23) | def silky_reverse(name, *args, **kwargs):
function get_fpath (line 34) | def get_fpath():
function _should_intercept (line 46) | def _should_intercept(request):
class TestMiddleware (line 66) | class TestMiddleware:
method process_response (line 67) | def process_response(self, request, response):
method process_request (line 70) | def process_request(self, request):
class SilkyMiddleware (line 74) | class SilkyMiddleware:
method __init__ (line 75) | def __init__(self, get_response):
method __call__ (line 86) | def __call__(self, request):
method _apply_dynamic_mappings (line 101) | def _apply_dynamic_mappings(self):
method process_request (line 124) | def process_request(self, request):
method _process_response (line 146) | def _process_response(self, request, response):
method process_response (line 172) | def process_response(self, request, response):
FILE: silk/migrations/0001_initial.py
class Migration (line 7) | class Migration(migrations.Migration):
FILE: silk/migrations/0002_auto_update_uuid4_id_field.py
class Migration (line 6) | class Migration(migrations.Migration):
FILE: silk/migrations/0003_request_prof_file.py
class Migration (line 6) | class Migration(migrations.Migration):
FILE: silk/migrations/0004_request_prof_file_storage.py
class Migration (line 8) | class Migration(migrations.Migration):
FILE: silk/migrations/0005_increase_request_prof_file_length.py
class Migration (line 8) | class Migration(migrations.Migration):
FILE: silk/migrations/0006_fix_request_prof_file_blank.py
class Migration (line 8) | class Migration(migrations.Migration):
FILE: silk/migrations/0007_sqlquery_identifier.py
class Migration (line 6) | class Migration(migrations.Migration):
FILE: silk/migrations/0008_sqlquery_analysis.py
class Migration (line 6) | class Migration(migrations.Migration):
FILE: silk/model_factory.py
class DefaultEncoder (line 30) | class DefaultEncoder(json.JSONEncoder):
method default (line 31) | def default(self, o):
function _parse_content_type (line 36) | def _parse_content_type(content_type):
class RequestModelFactory (line 52) | class RequestModelFactory:
method __init__ (line 57) | def __init__(self, request):
method content_type (line 61) | def content_type(self):
method encoded_headers (line 65) | def encoded_headers(self):
method _mask_credentials (line 83) | def _mask_credentials(self, body):
method _body (line 120) | def _body(self, raw_body, content_type):
method body (line 138) | def body(self):
method query_params (line 209) | def query_params(self):
method view_name (line 217) | def view_name(self):
method construct_request_model (line 225) | def construct_request_model(self):
class ResponseModelFactory (line 248) | class ResponseModelFactory:
method __init__ (line 251) | def __init__(self, response):
method body (line 256) | def body(self):
method construct_response_model (line 292) | def construct_response_model(self):
FILE: silk/models.py
function _time_taken (line 40) | def _time_taken(start_time, end_time):
function time_taken (line 45) | def time_taken(self):
class CaseInsensitiveDictionary (line 49) | class CaseInsensitiveDictionary(dict):
method __getitem__ (line 50) | def __getitem__(self, key):
method __setitem__ (line 53) | def __setitem__(self, key, value):
method update (line 56) | def update(self, other=None, **kwargs):
method __init__ (line 62) | def __init__(self, d):
class Request (line 68) | class Request(models.Model):
method _shorten (line 91) | def _shorten(self, string):
method total_meta_time (line 95) | def total_meta_time(self):
method profile_table (line 99) | def profile_table(self):
method time_spent_on_sql_queries (line 121) | def time_spent_on_sql_queries(self):
method headers (line 131) | def headers(self):
method content_type (line 140) | def content_type(self):
method garbage_collect (line 144) | def garbage_collect(cls, force=False):
method save (line 176) | def save(self, *args, **kwargs):
class Response (line 199) | class Response(models.Model):
method content_type (line 211) | def content_type(self):
method headers (line 215) | def headers(self):
method raw_body_decoded (line 223) | def raw_body_decoded(self):
class SQLQueryManager (line 228) | class SQLQueryManager(models.Manager):
method bulk_create (line 229) | def bulk_create(self, *args, **kwargs):
class SQLQuery (line 243) | class SQLQuery(models.Model):
method traceback_ln_only (line 259) | def traceback_ln_only(self):
method formatted_query (line 263) | def formatted_query(self):
method num_joins (line 267) | def num_joins(self):
method first_keywords (line 275) | def first_keywords(self):
method tables_involved (line 285) | def tables_involved(self):
method prepare_save (line 315) | def prepare_save(self):
method save (line 325) | def save(self, *args, **kwargs):
method delete (line 330) | def delete(self, *args, **kwargs):
class BaseProfile (line 337) | class BaseProfile(models.Model):
class Meta (line 347) | class Meta:
method save (line 350) | def save(self, *args, **kwargs):
class Profile (line 357) | class Profile(BaseProfile):
method is_function_profile (line 367) | def is_function_profile(self):
method is_context_profile (line 371) | def is_context_profile(self):
method time_spent_on_sql_queries (line 375) | def time_spent_on_sql_queries(self):
FILE: silk/profiling/dynamic.py
function _get_module (line 11) | def _get_module(module_name):
function _get_func (line 26) | def _get_func(module, func_name):
function profile_function_or_method (line 46) | def profile_function_or_method(module, func, name=None):
function _get_parent_module (line 65) | def _get_parent_module(module):
function _get_context_manager_source (line 77) | def _get_context_manager_source(end_line, file_path, name, start_line):
function _get_ws (line 99) | def _get_ws(txt):
function _get_source_lines (line 111) | def _get_source_lines(func):
function _new_func_from_source (line 119) | def _new_func_from_source(source, func):
function _inject_context_manager_func (line 153) | def _inject_context_manager_func(func, start_line, end_line, name):
function is_str_typ (line 198) | def is_str_typ(o):
function inject_context_manager_func (line 202) | def inject_context_manager_func(module, func, start_line, end_line, name):
FILE: silk/profiling/profiler.py
class silk_meta_profiler (line 19) | class silk_meta_profiler:
method __init__ (line 22) | def __init__(self):
method _should_meta_profile (line 27) | def _should_meta_profile(self):
method __enter__ (line 30) | def __enter__(self):
method __exit__ (line 34) | def __exit__(self, exc_type, exc_val, exc_tb):
method __call__ (line 46) | def __call__(self, target):
class silk_profile (line 65) | class silk_profile:
method __init__ (line 66) | def __init__(self, name=None, _dynamic=False):
method _query_identifiers_from_collector (line 74) | def _query_identifiers_from_collector(self):
method _start_queries (line 77) | def _start_queries(self):
method _end_queries (line 81) | def _end_queries(self):
method __enter__ (line 85) | def __enter__(self):
method _finalise_queries (line 108) | def _finalise_queries(self):
method __exit__ (line 117) | def __exit__(self, exc_type, exc_val, exc_tb):
method _silk_installed (line 125) | def _silk_installed(self):
method _should_profile (line 132) | def _should_profile(self):
method __call__ (line 135) | def __call__(self, target):
method distinct_queries (line 178) | def distinct_queries(self):
function blah (line 183) | def blah():
FILE: silk/request_filters.py
class FilterValidationError (line 16) | class FilterValidationError(Exception):
class BaseFilter (line 20) | class BaseFilter(Q):
method __init__ (line 21) | def __init__(self, value=None, *args, **kwargs):
method typ (line 26) | def typ(self):
method serialisable_value (line 30) | def serialisable_value(self):
method as_dict (line 33) | def as_dict(self):
method from_dict (line 37) | def from_dict(d):
method contribute_to_query_set (line 43) | def contribute_to_query_set(self, query_set):
class SecondsFilter (line 53) | class SecondsFilter(BaseFilter):
method __init__ (line 54) | def __init__(self, n):
method __str__ (line 67) | def __str__(self):
function _parse (line 71) | def _parse(dt, fmt):
class BeforeDateFilter (line 84) | class BeforeDateFilter(BaseFilter):
method __init__ (line 87) | def __init__(self, dt):
method serialisable_value (line 92) | def serialisable_value(self):
method __str__ (line 95) | def __str__(self):
class AfterDateFilter (line 99) | class AfterDateFilter(BaseFilter):
method __init__ (line 102) | def __init__(self, dt):
method serialisable_value (line 107) | def serialisable_value(self):
method __str__ (line 110) | def __str__(self):
class ViewNameFilter (line 114) | class ViewNameFilter(BaseFilter):
method __init__ (line 117) | def __init__(self, view_name):
method __str__ (line 121) | def __str__(self):
class PathFilter (line 125) | class PathFilter(BaseFilter):
method __init__ (line 128) | def __init__(self, path):
method __str__ (line 132) | def __str__(self):
class NameFilter (line 136) | class NameFilter(BaseFilter):
method __init__ (line 137) | def __init__(self, name):
method __str__ (line 141) | def __str__(self):
class FunctionNameFilter (line 145) | class FunctionNameFilter(BaseFilter):
method __init__ (line 146) | def __init__(self, func_name):
method __str__ (line 150) | def __str__(self):
class NumQueriesFilter (line 154) | class NumQueriesFilter(BaseFilter):
method __init__ (line 155) | def __init__(self, n):
method __str__ (line 162) | def __str__(self):
method contribute_to_query_set (line 165) | def contribute_to_query_set(self, query_set):
class TimeSpentOnQueriesFilter (line 169) | class TimeSpentOnQueriesFilter(BaseFilter):
method __init__ (line 170) | def __init__(self, n):
method __str__ (line 177) | def __str__(self):
method contribute_to_query_set (line 180) | def contribute_to_query_set(self, query_set):
class OverallTimeFilter (line 184) | class OverallTimeFilter(BaseFilter):
method __init__ (line 185) | def __init__(self, n):
method __str__ (line 192) | def __str__(self):
class StatusCodeFilter (line 196) | class StatusCodeFilter(BaseFilter):
method __init__ (line 197) | def __init__(self, n):
class MethodFilter (line 205) | class MethodFilter(BaseFilter):
method __init__ (line 206) | def __init__(self, value):
function filters_from_request (line 210) | def filters_from_request(request):
class FiltersManager (line 235) | class FiltersManager:
method __init__ (line 236) | def __init__(self, filters_key):
method save (line 239) | def save(self, request, filters):
method get (line 244) | def get(self, request):
FILE: silk/singleton.py
class Singleton (line 4) | class Singleton(type, metaclass=object):
method __init__ (line 5) | def __init__(cls, name, bases, d):
method __call__ (line 9) | def __call__(cls, *args):
FILE: silk/sql.py
function _should_wrap (line 14) | def _should_wrap(sql_query):
function _unpack_explanation (line 24) | def _unpack_explanation(result):
function _explain_query (line 32) | def _explain_query(connection, q, params):
function execute_sql (line 68) | def execute_sql(self, *args, **kwargs):
FILE: silk/static/silk/js/components/cell.js
function configureSpanFontColors (line 1) | function configureSpanFontColors(selector, okValue, badValue) {
function configureFontColors (line 16) | function configureFontColors() {
FILE: silk/static/silk/js/components/filters.js
function configureResizingInputs (line 2) | function configureResizingInputs() {
function initFilters (line 48) | function initFilters() {
FILE: silk/static/silk/js/pages/profile_detail.js
function createViz (line 1) | function createViz() {
FILE: silk/static/silk/js/pages/root_base.js
function initFilterButton (line 1) | function initFilterButton() {
function submitFilters (line 9) | function submitFilters() {
function submitEmptyFilters (line 12) | function submitEmptyFilters() {
FILE: silk/static/silk/lib/highlight/highlight.pack.js
function k (line 1) | function k(v){return v.replace(/&/gm,"&").replace(/</gm,"<").repl...
function t (line 1) | function t(v){return v.nodeName.toLowerCase()}
function i (line 1) | function i(w,x){var v=w&&w.exec(x);return v&&v.index==0}
function d (line 1) | function d(v){return Array.prototype.map.call(v.childNodes,function(w){i...
function r (line 1) | function r(w){var v=(w.className+" "+(w.parentNode?w.parentNode.classNam...
function o (line 1) | function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y)...
function u (line 1) | function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nex...
function q (line 1) | function q(w,y,C){var x=0;var F="";var z=[];function B(){if(!w.length||!...
function m (line 1) | function m(y){function v(z){return(z&&z.source)||z}function w(A,z){retur...
function c (line 1) | function c(S,L,J,R){function v(U,V){for(var T=0;T<V.c.length;T++){if(i(V...
function g (line 1) | function g(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:k(y)};...
function h (line 1) | function h(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\t)+)/gm,function...
function p (line 1) | function p(z){var y=d(z);var A=r(z);if(A=="no-highlight"){return}var v=A...
function s (line 1) | function s(v){b=o(b,v)}
function l (line 1) | function l(){if(l.called){return}l.called=true;var v=document.querySelec...
function a (line 1) | function a(){addEventListener("DOMContentLoaded",l,false);addEventListen...
function e (line 1) | function e(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(funct...
function j (line 1) | function j(v){return f[v]||f[n[v]]}
FILE: silk/static/silk/lib/jquery.datetimepicker.js
function getCurrentValue (line 1855) | function getCurrentValue() {
function HighlightedDate (line 1993) | function HighlightedDate(date, desc, style) {
function b (line 2009) | function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=...
function c (line 2009) | function c(){f=null}
function d (line 2009) | function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type...
FILE: silk/static/silk/lib/sortable.js
function dean_addEvent (line 379) | function dean_addEvent(element, type, handler) {
function removeEvent (line 405) | function removeEvent(element, type, handler) {
function handleEvent (line 416) | function handleEvent(event) {
function fixEvent (line 432) | function fixEvent(event) {
FILE: silk/static/silk/lib/viz-lite.js
function globalEval (line 21) | function globalEval(x){abort("NO_DYNAMIC_EXECUTION=1 was set, cannot eva...
function assert (line 21) | function assert(condition,text){if(!condition){abort("Assertion failed: ...
function getCFunc (line 21) | function getCFunc(ident){var func=Module["_"+ident];if(!func){abort("NO_...
function setValue (line 21) | function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(...
function getValue (line 21) | function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.l...
function allocate (line 21) | function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof ...
function Pointer_stringify (line 21) | function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var ...
function UTF8ArrayToString (line 21) | function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[end...
function UTF8ToString (line 21) | function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}
function stringToUTF8Array (line 21) | function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(m...
function stringToUTF8 (line 21) | function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Arr...
function lengthBytesUTF8 (line 21) | function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){va...
function demangle (line 21) | function demangle(func){var __cxa_demangle_func=Module["___cxa_demangle"...
function demangleAll (line 21) | function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(...
function jsStackTrace (line 21) | function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new E...
function stackTrace (line 21) | function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"]...
function updateGlobalBufferViews (line 21) | function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(b...
function abortOnCannotGrowMemory (line 21) | function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. ...
function enlargeMemory (line 21) | function enlargeMemory(){abortOnCannotGrowMemory()}
function getTotalMemory (line 21) | function getTotalMemory(){return TOTAL_MEMORY}
function callRuntimeCallbacks (line 21) | function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var c...
function preRun (line 21) | function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="func...
function ensureInitRuntime (line 21) | function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitial...
function preMain (line 21) | function preMain(){callRuntimeCallbacks(__ATMAIN__)}
function exitRuntime (line 21) | function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}
function postRun (line 21) | function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="f...
function addOnPreRun (line 21) | function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}
function addOnPostRun (line 21) | function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}
function intArrayFromString (line 21) | function intArrayFromString(stringy,dontAddNull,length){var len=length>0...
function writeArrayToMemory (line 21) | function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}
function writeAsciiToMemory (line 21) | function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.le...
function getUniqueRunDependency (line 21) | function getUniqueRunDependency(id){return id}
function addRunDependency (line 21) | function addRunDependency(id){runDependencies++;if(Module["monitorRunDep...
function removeRunDependency (line 21) | function removeRunDependency(id){runDependencies--;if(Module["monitorRun...
function _emscripten_asm_const_iii (line 21) | function _emscripten_asm_const_iii(code,a0,a1){return ASM_CONSTS[code](a...
function ___assert_fail (line 21) | function ___assert_fail(condition,filename,line,func){ABORT=true;throw"A...
function ___setErrNo (line 21) | function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module...
function trim (line 21) | function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[sta...
function isRealDir (line 21) | function isRealDir(p){return p!=="."&&p!==".."}
function toAbsolute (line 21) | function toAbsolute(root){return(function(p){return PATH.join2(root,p)})}
function done (line 21) | function done(err){if(err){if(!done.errored){done.errored=true;return ca...
function ensureParent (line 21) | function ensureParent(path){var parts=path.split("/");var parent=root;fo...
function base (line 21) | function base(path){var parts=path.split("/");return parts[parts.length-1]}
function doCallback (line 21) | function doCallback(err){assert(FS.syncFSRequests>0);FS.syncFSRequests--...
function done (line 21) | function done(err){if(err){if(!done.errored){done.errored=true;return do...
function LazyUint8Array (line 21) | function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}
function processData (line 21) | function processData(byteArray){function finish(byteArray){if(preFinish)...
function finish (line 21) | function finish(){if(fail==0)onload();else onerror()}
function finish (line 21) | function finish(){if(fail==0)onload();else onerror()}
function ___syscall192 (line 21) | function ___syscall192(which,varargs){SYSCALLS.varargs=varargs;try{var a...
function ___syscall195 (line 21) | function ___syscall195(which,varargs){SYSCALLS.varargs=varargs;try{var p...
function ___syscall197 (line 21) | function ___syscall197(which,varargs){SYSCALLS.varargs=varargs;try{var s...
function ___lock (line 21) | function ___lock(){}
function ___unlock (line 21) | function ___unlock(){}
function _realloc (line 21) | function _realloc(){throw"bad"}
function ___buildEnvironment (line 21) | function ___buildEnvironment(env){var MAX_ENV_VALUES=64;var TOTAL_ENV_SI...
function _setenv (line 21) | function _setenv(envname,envval,overwrite){if(envname===0){___setErrNo(E...
function __exit (line 21) | function __exit(status){Module["exit"](status)}
function _exit (line 21) | function _exit(status){__exit(status)}
function ___syscall91 (line 21) | function ___syscall91(which,varargs){SYSCALLS.varargs=varargs;try{var ad...
function ___syscall54 (line 21) | function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var st...
function _longjmp (line 21) | function _longjmp(env,value){Module["setThrew"](env,value||1);throw"long...
function _llvm_trap (line 21) | function _llvm_trap(){abort("trap!")}
function ___syscall33 (line 21) | function ___syscall33(which,varargs){SYSCALLS.varargs=varargs;try{var pa...
function _emscripten_get_now (line 21) | function _emscripten_get_now(){abort()}
function _emscripten_get_now_is_monotonic (line 21) | function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||...
function _clock_gettime (line 21) | function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()...
function ___clock_gettime (line 21) | function ___clock_gettime(){return _clock_gettime.apply(null,arguments)}
function ___syscall10 (line 21) | function ___syscall10(which,varargs){SYSCALLS.varargs=varargs;try{var pa...
function ___map_file (line 21) | function ___map_file(pathname,size){___setErrNo(ERRNO_CODES.EPERM);retur...
function _getenv (line 21) | function _getenv(name){if(name===0)return 0;name=Pointer_stringify(name)...
function ___syscall5 (line 21) | function ___syscall5(which,varargs){SYSCALLS.varargs=varargs;try{var pat...
function _emscripten_memcpy_big (line 21) | function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray...
function ___syscall6 (line 21) | function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var str...
function _times (line 21) | function _times(buffer){if(buffer!==0){_memset(buffer,0,16)}return 0}
function _abort (line 21) | function _abort(){Module["abort"]()}
function ___syscall140 (line 21) | function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var s...
function ___syscall146 (line 21) | function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var s...
function ___syscall221 (line 21) | function ___syscall221(which,varargs){SYSCALLS.varargs=varargs;try{var s...
function ___syscall145 (line 21) | function ___syscall145(which,varargs){SYSCALLS.varargs=varargs;try{var s...
function invoke_iiii (line 21) | function invoke_iiii(index,a1,a2,a3){try{return Module["dynCall_iiii"](i...
function invoke_d (line 21) | function invoke_d(index){try{return Module["dynCall_d"](index)}catch(e){...
function invoke_viiiii (line 21) | function invoke_viiiii(index,a1,a2,a3,a4,a5){try{Module["dynCall_viiiii"...
function invoke_i (line 21) | function invoke_i(index){try{return Module["dynCall_i"](index)}catch(e){...
function invoke_vi (line 21) | function invoke_vi(index,a1){try{Module["dynCall_vi"](index,a1)}catch(e)...
function invoke_vii (line 21) | function invoke_vii(index,a1,a2){try{Module["dynCall_vii"](index,a1,a2)}...
function invoke_iiiiiii (line 21) | function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){try{return Module["dynC...
function invoke_viiiddi (line 21) | function invoke_viiiddi(index,a1,a2,a3,a4,a5,a6){try{Module["dynCall_vii...
function invoke_ii (line 21) | function invoke_ii(index,a1){try{return Module["dynCall_ii"](index,a1)}c...
function invoke_dddd (line 21) | function invoke_dddd(index,a1,a2,a3){try{return Module["dynCall_dddd"](i...
function invoke_viii (line 21) | function invoke_viii(index,a1,a2,a3){try{Module["dynCall_viii"](index,a1...
function invoke_v (line 21) | function invoke_v(index){try{Module["dynCall_v"](index)}catch(e){if(type...
function invoke_iiiii (line 21) | function invoke_iiiii(index,a1,a2,a3,a4){try{return Module["dynCall_iiii...
function invoke_viiiiii (line 21) | function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module["dynCall_vii...
function invoke_iii (line 21) | function invoke_iii(index,a1,a2){try{return Module["dynCall_iii"](index,...
function invoke_iiiiii (line 21) | function invoke_iiiiii(index,a1,a2,a3,a4,a5){try{return Module["dynCall_...
function invoke_viiii (line 21) | function invoke_viiii(index,a1,a2,a3,a4){try{Module["dynCall_viiii"](ind...
function cr (line 25) | function cr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if(d|0){e=ym(c[c[42047]>>2]...
function dr (line 25) | function dr(a,b,d){a=a|0;b=b|0;d=d|0;c[42014]=b;c[42046]=a;c[41994]=0;a=...
function er (line 25) | function er(a,b){a=a|0;b=b|0;return dr(0,a,b)|0}
function fr (line 25) | function fr(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|...
function gr (line 25) | function gr(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+112|0;e=h;g=h+4...
function hr (line 25) | function hr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|...
function ir (line 25) | function ir(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0...
function jr (line 25) | function jr(a,b){a=a|0;b=b|0;var c=0;c=TK(b)|0;b=(hr(a,b,c)|0)==(c|0);re...
function kr (line 25) | function kr(b,c){b=b|0;c=c|0;var d=0,e=0;d=l;l=l+16|0;e=d;a[e>>0]=c;b=(h...
function lr (line 25) | function lr(b){b=b|0;var d=0;d=c[b+36>>2]|0;if(((d|0)!=0?(a[b+144>>0]|0)...
function mr (line 25) | function mr(a){a=a|0;var b=0,d=0;b=c[a+76>>2]|0;if(b|0?(d=c[b+4>>2]|0,d|...
function nr (line 25) | function nr(a){a=a|0;var b=0,d=0,e=0;e=l;l=l+16|0;d=c[a+76>>2]|0;if(c[a+...
function or (line 25) | function or(b){b=b|0;var d=0,e=0,f=0;d=b+32|0;if((c[d>>2]|0?(e=b+36|0,f=...
function pr (line 25) | function pr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+105...
function qr (line 25) | function qr(a,b){a=a|0;b=+b;var d=0,e=0,f=0;d=l;l=l+16|0;e=d;f=rr(e,b)|0...
function rr (line 25) | function rr(b,d){b=b|0;d=+d;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(!(d<-...
function sr (line 25) | function sr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d;f=rr(e,+h[...
function tr (line 25) | function tr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;f=...
function ur (line 25) | function ur(a,b){a=a|0;b=b|0;var d=0;d=sw(392)|0;if(d|0){c[d>>2]=19216;c...
function vr (line 25) | function vr(a){a=a|0;var b=0,d=0,e=0,f=0;b=sw(392)|0;d=b;e=a;f=d+40|0;do...
function wr (line 25) | function wr(a){a=a|0;Dr(a);xN(a);return}
function xr (line 25) | function xr(a,b){a=a|0;b=b|0;var d=0,e=0;e=a+160|0;d=c[e>>2]|0;if(d){e=c...
function yr (line 25) | function yr(a,b){a=a|0;b=b|0;var d=0,e=0;e=a+160|0;d=c[e>>2]|0;if(d){e=c...
function zr (line 25) | function zr(a){a=a|0;var b=0;b=c[a+160>>2]|0;c[a+164>>2]=b;return b|0}
function Ar (line 25) | function Ar(a){a=a|0;var b=0,d=0,e=0;a=a+164|0;b=c[a>>2]|0;d=c[b+4>>2]|0...
function Br (line 25) | function Br(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+8|0;f=b+10|0;if((c[...
function Cr (line 25) | function Cr(a){a=a|0;var b=0;b=c[a>>2]|0;if(b|0)xN(b);c[a>>2]=0;c[a+8>>2...
function Dr (line 25) | function Dr(a){a=a|0;var b=0,d=0,e=0;d=a+160|0;b=c[d>>2]|0;while(1){if(!...
function Er (line 25) | function Er(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0...
function Fr (line 25) | function Fr(a,b){a=a|0;b=b|0;b=l;l=l+16|0;_l(1,83375,b)|0;l=b;return 0}
function Gr (line 25) | function Gr(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0...
function Hr (line 25) | function Hr(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;do if(!e)e=0;el...
function Ir (line 25) | function Ir(b){b=b|0;var d=0;if(!b)va(95990,83423,573,83437);if(!(a[b>>0...
function Jr (line 25) | function Jr(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=...
function Kr (line 25) | function Kr(b){b=b|0;var d=0,e=0;if(a[b+17>>0]|0?(d=b+20|0,e=c[d>>2]|0,e...
function Lr (line 25) | function Lr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0;if(!b){e=-1...
function Mr (line 25) | function Mr(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0...
function Nr (line 25) | function Nr(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+16|0;e=f;if(!a)va(95990...
function Or (line 25) | function Or(a){a=a|0;var b=0;b=c[a+8>>2]|0;if(b|0)cp(0,b)|0;xN(a);return}
function Pr (line 25) | function Pr(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+224|0;e...
function Qr (line 25) | function Qr(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+16|0;b=f+4|0;d=f;c[a+48...
function Rr (line 25) | function Rr(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+16|0;b=f+4|0;d=f;c[a+48...
function Sr (line 25) | function Sr(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;b=h+12|0;d...
function Tr (line 25) | function Tr(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0...
function Ur (line 25) | function Ur(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l...
function Vr (line 25) | function Vr(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+16|0;b=h+4|...
function Wr (line 25) | function Wr(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0...
function Xr (line 25) | function Xr(a){a=a|0;var b=0,d=0,e=0,f=0.0,g=0.0;d=l;l=l+32|0;b=d;c[a+48...
function Yr (line 25) | function Yr(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+16|0;b=f+4|0;d=f;c[a+48...
function Zr (line 25) | function Zr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;c[d>>2]=0;e=0;while(1){...
function _r (line 25) | function _r(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+1040|0;d=h;...
function $r (line 25) | function $r(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+1024|0;f=g;as(b);e=...
function as (line 25) | function as(b){b=b|0;var d=0;d=c[b>>2]|0;while(1){d=a[d>>0]|0;if(!(d<<24...
function bs (line 25) | function bs(b){b=b|0;var d=0;d=b+4|0;if(!(DL(c[d>>2]|0,1024,c[b+8>>2]|0)...
function cs (line 25) | function cs(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;as(b);e=0;f=c[b>>2]|0;while...
function ds (line 25) | function ds(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0;e=l;l=l+16|0;f=e;d=+nN(a,...
function es (line 25) | function es(a,b){a=+a;b=b|0;var c=0.0,d=0.0;d=a*72.0;do if(!(vJ(b,83714)...
function fs (line 25) | function fs(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;c[d>>2]=0;e=0;while(1){...
function gs (line 25) | function gs(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;a=c[b+20>>2]|0;if(a|0)AL(a)...
function hs (line 25) | function hs(){var a=0;ym(0,1,86200,90487)|0;a=ur(0,1)|0;rE(a,0);return a|0}
function is (line 25) | function is(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0...
function js (line 25) | function js(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l...
function ks (line 25) | function ks(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l...
function ls (line 25) | function ls(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0...
function ms (line 25) | function ms(a,b){a=a|0;b=b|0;pE(a,0,b);return}
function ns (line 25) | function ns(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if(!((a|0)!=0?(vs(a...
function os (line 25) | function os(a,b){a=a|0;b=b|0;io(b,a,1)|0;return}
function ps (line 25) | function ps(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[b>>2]=d;c[b+4>>2]...
function qs (line 25) | function qs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0...
function rs (line 25) | function rs(a){a=a|0;var b=0;a=c[(c[a>>2]|0)+12>>2]|0;while(1){if(!a)bre...
function ss (line 25) | function ss(a){a=a|0;xN(c[a>>2]|0);xN(a);return}
function ts (line 25) | function ts(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l...
function us (line 25) | function us(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=a+8|0;b=c[f>>2]|0;d=a+4|0...
function vs (line 25) | function vs(b){b=b|0;var c=0;a:while(1){c=b;b=b+1|0;c=a[c>>0]|0;switch(c...
function ws (line 25) | function ws(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=0;f=co(a)|0;while(1){if(!...
function xs (line 25) | function xs(a){a=a|0;a=Mo(a,83972,0)|0;if(!a)va(83977,83980,529,83989);e...
function ys (line 25) | function ys(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0...
function zs (line 25) | function zs(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h;c[g>>2...
function As (line 25) | function As(b,d){b=b|0;d=d|0;var e=0;b=(c[b+16>>2]|0)+8|0;e=a[b>>0]|0;if...
function Bs (line 25) | function Bs(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=co(a)|0;while(1){if(!e)br...
function Cs (line 25) | function Cs(a){a=a|0;return ws(a,c[a+60>>2]|0)|0}
function Ds (line 25) | function Ds(a,b){a=a|0;b=b|0;Es(a,b,0);return}
function Es (line 25) | function Es(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;g=(d|0)==0;b=Jp(b)|...
function Fs (line 25) | function Fs(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=0;h=co(a)|0;w...
function Gs (line 25) | function Gs(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=l;l=l...
function Hs (line 25) | function Hs(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0...
function Is (line 25) | function Is(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0...
function Js (line 25) | function Js(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0...
function Ks (line 25) | function Ks(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0,j=0,k=0,m=0.0,n=0...
function Ls (line 25) | function Ls(a,b){a=a|0;b=b|0;var d=0;d=c[42109]|0;a=c[d+(c[(c[a>>2]|0)+1...
function Ms (line 25) | function Ms(a,b){a=a|0;b=b|0;var d=0.0,e=0.0;a=c[a>>2]|0;b=c[b>>2]|0;e=+...
function Ns (line 25) | function Ns(a,b,e){a=a|0;b=b|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,m...
function Os (line 25) | function Os(a,b,e,f,g,i){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0...
function Ps (line 25) | function Ps(a,b,e,f,g,i){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0...
function Qs (line 25) | function Qs(a,b){a=a|0;b=b|0;return (c[c[b>>2]>>2]|0)-(c[c[a>>2]>>2]|0)|0}
function Rs (line 25) | function Rs(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0...
function Ss (line 25) | function Ss(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var...
function Ts (line 25) | function Ts(a,b,e,f,g,i,j){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;var...
function Us (line 25) | function Us(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=(c[b+4>>2]|0)-(c[d+4>>2]|...
function Vs (line 25) | function Vs(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=(c[d+4>>2]|0)+(c[b+4>>2]|...
function Ws (line 25) | function Ws(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var...
function Xs (line 25) | function Xs(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0...
function Ys (line 25) | function Ys(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0.0,m...
function Zs (line 25) | function Zs(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0.0,l=0.0...
function _s (line 25) | function _s(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=Is(a,b,d,e)|0;if(...
function $s (line 25) | function $s(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0...
function at (line 25) | function at(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;h=l;l=l+16|...
function bt (line 25) | function bt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=...
function ct (line 25) | function ct(a,b,c){a=a|0;b=b|0;c=c|0;return dt(Im(a,84551)|0,b,c)|0}
function dt (line 25) | function dt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0...
function et (line 25) | function et(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;a:do if((a[b>>0]|0)==95){f=...
function ft (line 25) | function ft(a){a=a|0;switch(a|0){case 1:{a=92999;break}case 2:{a=96289;b...
function gt (line 25) | function gt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0...
function ht (line 25) | function ht(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0...
function it (line 25) | function it(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0;i=l;l=l+16|0;e=i;h[...
function jt (line 25) | function jt(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0;k=l;l=l+16|...
function kt (line 25) | function kt(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;i=...
function lt (line 25) | function lt(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=a[b>>0]|0;f=d+8|0;g=b+1|0...
function mt (line 25) | function mt(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0;f=l;l=l+16|0;d=f;e=+nN(a,...
function nt (line 25) | function nt(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;a=pt(a,e)|0;e=...
function ot (line 25) | function ot(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[b>>2]=qJ(a,e...
function pt (line 25) | function pt(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[b>>2]=rJ(a,e...
function qt (line 25) | function qt(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l...
function rt (line 25) | function rt(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0...
function st (line 25) | function st(a,b,c){a=a|0;b=b|0;c=c|0;return gt(a,b,c,0)|0}
function tt (line 25) | function tt(a){a=a|0;return st(a,0,0)|0}
function ut (line 25) | function ut(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;e=c[a+12>>2]|0;if(a|0){...
function vt (line 25) | function vt(a){a=a|0;var b=0,d=0;b=a+8|0;d=b+4|0;switch(c[a>>2]|0){case ...
function wt (line 25) | function wt(a){a=a|0;var b=0,d=0,e=0;switch(c[a>>2]|0){case 1:{e=a+40|0;...
function xt (line 25) | function xt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0...
function yt (line 25) | function yt(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0...
function zt (line 25) | function zt(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=l;l=l+16|0;e=f;c[e>>2]=0;...
function At (line 25) | function At(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;while(1){e=c[b>>2]|...
function Bt (line 25) | function Bt(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0,g=0,i=0;g=0;d=0.0;while(1...
function Ct (line 25) | function Ct(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0.0,j=0...
function Dt (line 25) | function Dt(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0.0,j=0...
function Et (line 25) | function Et(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0.0,j=0...
function Ft (line 25) | function Ft(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0.0,j=0...
function Gt (line 25) | function Gt(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0,j=0,k...
function Ht (line 25) | function Ht(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=+e;f=f|0;var g=0,i=0,j...
function It (line 25) | function It(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0.0,j=0...
function Jt (line 25) | function Jt(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0;g=l;l...
function Kt (line 25) | function Kt(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0.0,j...
function Lt (line 25) | function Lt(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0;f=c[a>>2]|0;e=+h[b>>3]-...
function Mt (line 25) | function Mt(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0...
function Nt (line 25) | function Nt(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var...
function Ot (line 25) | function Ot(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;var f=0.0,g=0.0,i=0....
function Pt (line 25) | function Pt(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=+g;i=i|0;var j...
function Qt (line 25) | function Qt(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=+g;i=i|0;var j...
function Rt (line 25) | function Rt(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i+8|0;f=...
function St (line 25) | function St(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0;k=l;l=l+16|0;j=...
function Tt (line 25) | function Tt(a){a=a|0;var b=0;a=a+16|0;b=c[a>>2]|0;if(!b)va(84881,84885,1...
function Ut (line 25) | function Ut(d,e,f,g,h,i,j){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var...
function Vt (line 25) | function Vt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=l;l=l+80|...
function Wt (line 25) | function Wt(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+144|0;h=i;g...
function Xt (line 25) | function Xt(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,i=0.0,j=0,k=0.0,m=0.0...
function Yt (line 25) | function Yt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0.0,k=0.0,m=0.0,n...
function Zt (line 25) | function Zt(a){a=a|0;xN(c[a+4>>2]|0);xN(c[a+8>>2]|0);xN(a);return}
function _t (line 25) | function _t(b){b=b|0;var d=0.0,e=0,f=0,g=0;f=l;l=l+16|0;e=f;b=VK(b,59)|0...
function $t (line 25) | function $t(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,i=0,j=0,k=0,m=0.0...
function au (line 25) | function au(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[a+16>>2]|0;e=c[...
function bu (line 25) | function bu(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0,f=0.0,g=0.0,i=0.0,j=0,k=0...
function cu (line 25) | function cu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0.0,h=0,i=0;b=l;l=l+48|0;d=b+...
function du (line 25) | function du(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0.0,j=0,k=0,m=0,n=0.0...
function eu (line 25) | function eu(a,b){a=a|0;b=b|0;var d=0;d=St(a)|0;c[d+4>>2]=0;c[d+8>>2]=b;c...
function fu (line 25) | function fu(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;AD(b,119608);d=Im(c,853...
function gu (line 25) | function gu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l...
function hu (line 25) | function hu(a){a=a|0;return (c[a+160>>2]|0)<=(c[a+156>>2]|0)|0}
function iu (line 25) | function iu(a){a=a|0;var b=0;b=c[(c[a>>2]|0)+316>>2]|0;return c[((b|0)==...
function ju (line 25) | function ju(a){a=a|0;var b=0,d=0;d=a+172|0;b=c[d+4>>2]|0;a=a+196|0;c[a>>...
function ku (line 25) | function ku(a){a=a|0;var b=0,d=0;d=c[a+196>>2]|0;if(((d|0)>-1?(d|0)<(c[a...
function lu (line 25) | function lu(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0...
function mu (line 25) | function mu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;h=l;l=l+32|0;d=...
function nu (line 25) | function nu(a,b){a=a|0;b=b|0;var d=0;d=c[b>>2]|0;a=a+160|0;if(!d)c[a>>2]...
function ou (line 25) | function ou(a){a=a|0;eD(a);Tt(a);return}
function pu (line 25) | function pu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=(c[d+4>>2]|0)+(c[b+4>>2]|...
function qu (line 25) | function qu(a){a=a|0;var b=0.0,d=0,e=0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0,o=0...
function ru (line 25) | function ru(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p...
function su (line 25) | function su(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=(c[a>>2]|0)+28|0;...
function tu (line 25) | function tu(e,f,i){e=e|0;f=f|0;i=i|0;var j=0,k=0,m=0,n=0.0,o=0,p=0,q=0,r...
function uu (line 25) | function uu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=l;l=l+32|...
function vu (line 25) | function vu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=l;l=l+32|0;g=h;e=...
function wu (line 25) | function wu(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+16|0;a=1;while(1){e=c[d>>2]...
function xu (line 25) | function xu(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+16|0;a=1;while(1){e=c[d>>2]...
function yu (line 25) | function yu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+64|0;i=...
function zu (line 25) | function zu(b,d){b=b|0;d=d|0;var e=0,f=0;a:do if((c[b+156>>2]|0)>=2?(e=C...
function Au (line 25) | function Au(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0...
function Bu (line 25) | function Bu(d,f,g){d=d|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0.0,n=0,o=0,p=0,q...
function Cu (line 25) | function Cu(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0...
function Du (line 25) | function Du(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0...
function Eu (line 25) | function Eu(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;j=l...
function Fu (line 25) | function Fu(b,d,e,f,g,h,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0...
function Gu (line 25) | function Gu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0;d=c[a+16>>2]|0;...
function Hu (line 25) | function Hu(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0...
function Iu (line 25) | function Iu(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}
function Ju (line 25) | function Ju(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0,j=0,k=0;d=c[a+1...
function Ku (line 25) | function Ku(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;i=+i;var j...
function Lu (line 25) | function Lu(b,d){b=b|0;d=d|0;var e=0,f=0;e=1;a:while(1){switch(a[b>>0]|0...
function Mu (line 25) | function Mu(b){b=b|0;var d=0,e=0;d=c[42261]|0;a:do if(!d)e=7;else{d=Jm(b...
function Nu (line 25) | function Nu(a){a=a|0;if(a|0){xN(c[a+8>>2]|0);xN(a)}return}
function Ou (line 25) | function Ou(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0;e=+h[b>>3]-+h...
function Pu (line 25) | function Pu(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0...
function Qu (line 25) | function Qu(a,b,c){a=+a;b=+b;c=+c;return +((1.0-a/b)*c*.5)}
function Ru (line 25) | function Ru(a,b,c){a=+a;b=+b;c=+c;return +(c*.5)}
function Su (line 25) | function Su(a,b,c){a=+a;b=+b;c=+c;return +(a/b*c*.5)}
function Tu (line 25) | function Tu(a,b,c){a=+a;b=+b;c=+c;b=a/b;return +((!(b<=.5)?1.0-b:b)*c)}
function Uu (line 25) | function Uu(a,b,d,e){a=a|0;b=+b;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0,k=0,m=...
function Vu (line 25) | function Vu(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0.0,f=0.0;e=+h[a+16>>3];c=+...
function Wu (line 25) | function Wu(b,d){b=b|0;d=d|0;d=so(d)|0;if((a[(c[d+16>>2]|0)+115>>0]|0)==...
function Xu (line 25) | function Xu(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;var g=0,h=0,i=0,j=0,...
function Yu (line 25) | function Yu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+144|0;f=g+128|0...
function Zu (line 25) | function Zu(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=+g;var i=0.0,j=...
function _u (line 25) | function _u(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0...
function $u (line 25) | function $u(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0;f=+h[b+8>>3];...
function av (line 25) | function av(a,b){a=a|0;b=b|0;var d=0;d=tw(24)|0;c[d+16>>2]=0;c[d>>2]=c[a...
function bv (line 25) | function bv(b){b=b|0;var c=0,d=0,e=0,f=0,g=0;c=b;g=b;a:while(1){d=0;whil...
function cv (line 25) | function cv(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[b>>2]|0;whi...
function dv (line 25) | function dv(a){a=a|0;switch(a|0){case 0:case 44:case 41:case 40:{a=1;bre...
function ev (line 25) | function ev(a,b){a=a|0;b=b|0;return fv(c[a>>2]|0,c[a+160>>2]|0,c[a+156>>...
function fv (line 25) | function fv(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0...
function gv (line 25) | function gv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=a[d>>0]|0;if(!(h<...
function hv (line 25) | function hv(b){b=b|0;var c=0;while(1){c=a[b>>0]|0;if(!(c<<24>>24)){b=1;b...
function iv (line 25) | function iv(a,b){a=a|0;b=b|0;if((+h[a+16>>3]>=+h[b>>3]?+h[b+16>>3]>=+h[a...
function jv (line 25) | function jv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;a:do if((c[b+156>>2]|0)...
function kv (line 25) | function kv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+64|0;e=d+32|0;f=d;a...
function lv (line 25) | function lv(a,d){a=a|0;d=d|0;var f=0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p...
function mv (line 25) | function mv(a){a=a|0;qD(a);Tt(a);return}
function nv (line 25) | function nv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l...
function ov (line 25) | function ov(b){b=b|0;var d=0,e=0;b=DA(b,c[42227]|0,174318)|0;a:do if(!(a...
function pv (line 25) | function pv(a){a=a|0;var b=0.0;if(((c[a+8>>2]|0)==4?(b=+h[a+16>>3],((~~(...
function qv (line 25) | function qv(a,b,c){a=+a;b=+b;c=c|0;var d=0.0,e=0,f=0.0,g=0;f=6.283185307...
function rv (line 25) | function rv(b,d){b=b|0;d=d|0;var e=0;a:do if((c[b+156>>2]|0)>=2?(e=CA(d,...
function sv (line 25) | function sv(a,b){a=a|0;b=b|0;var d=0;d=St(a)|0;c[d+4>>2]=1;c[d+8>>2]=b;c...
function tv (line 25) | function tv(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;b=Im(b,86439)|0;a:d...
function uv (line 25) | function uv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l...
function vv (line 25) | function vv(a,b){a=a|0;b=b|0;kD(a,b);Tt(a);return}
function wv (line 25) | function wv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,i=0,j=0.0,k=0,m=0,n=0,o=0.0...
function xv (line 25) | function xv(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=c[b>>2]|0;f=g...
function yv (line 25) | function yv(a,b){a=a|0;b=b|0;var d=0;d=c[b>>2]|0;c[a>>2]=c[b+4>>2];c[a+4...
function zv (line 25) | function zv(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=d+16|0;f=1;while(1){d=c[g...
function Av (line 25) | function Av(a){a=a|0;var b=0,d=0,e=0;b=c[42180]|0;if(!b){b=Ql(19688,c[43...
function Bv (line 25) | function Bv(a,b,c){a=a|0;b=b|0;c=c|0;xN(b);return}
function Cv (line 25) | function Cv(a){a=a|0;var b=0;b=c[42181]|0;if(!a){if((b|0)>0?(b=b+-1|0,c[...
function Dv (line 25) | function Dv(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0...
function Ev (line 25) | function Ev(a){a=a|0;var b=0;b=co(a)|0;while(1){if(!b)break;Rv(a,b);b=eo...
function Fv (line 25) | function Fv(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0...
function Gv (line 25) | function Gv(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=b+304|0;f=c[e>>2]|0;i...
function Hv (line 25) | function Hv(b){b=b|0;var c=0;b=Im(b,85812)|0;a:do if(!b)b=0;else{c=b+1|0...
function Iv (line 25) | function Iv(b){b=b|0;var d=0,e=0.0,f=0;d=c[b>>2]|0;f=b+240|0;if(!(a[d+29...
function Jv (line 25) | function Jv(b){b=b|0;var d=0,e=0;d=c[b>>2]|0;e=b+416|0;a:do if(!(a[d+293...
function Kv (line 25) | function Kv(b,d){b=b|0;d=d|0;var e=0.0,f=0,g=0;g=c[(c[b>>2]|0)+192>>2]|0...
function ob (line 26) | function ob(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}
function pb (line 26) | function pb(){return l|0}
function qb (line 26) | function qb(a){a=a|0;l=a}
function rb (line 26) | function rb(a,b){a=a|0;b=b|0;l=a;m=b}
function sb (line 26) | function sb(a,b){a=a|0;b=b|0;if(!o){o=a;p=b}}
function tb (line 26) | function tb(a){a=a|0;D=a}
function ub (line 26) | function ub(){return D|0}
function vb (line 26) | function vb(a){a=a|0;c[41846]=a;return 0}
function wb (line 26) | function wb(){return c[41846]|0}
function xb (line 26) | function xb(a,b){a=a|0;b=b|0;Na(0,a|0,b|0)|0;return}
function yb (line 26) | function yb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|...
function zb (line 26) | function zb(a){a=a|0;var d=0,e=0,f=0,g=0;g=l;l=l+16|0;d=g+4|0;e=g;f=c[(c...
function Ab (line 26) | function Ab(a){a=a|0;var b=0,d=0,e=0,f=0;e=c[(c[a+16>>2]|0)+8>>2]|0;if(!...
function Bb (line 26) | function Bb(b){b=b|0;var d=0,e=0;d=c[41851]|0;if((d|0)!=(c[41850]|0)){e=...
function Cb (line 26) | function Cb(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;j=wN(8240)|...
function Db (line 26) | function Db(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+1040|0;h=j;...
function Eb (line 26) | function Eb(b){b=b|0;var d=0,e=0;e=c[(c[b+16>>2]|0)+8>>2]|0;d=c[c[41882]...
function Fb (line 26) | function Fb(b){b=b|0;var d=0,e=0;e=c[(c[b+16>>2]|0)+8>>2]|0;b=c[41855]|0...
function Gb (line 26) | function Gb(b){b=b|0;var d=0,e=0;e=c[(c[b+16>>2]|0)+8>>2]|0;b=c[41855]|0...
function Hb (line 26) | function Hb(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0...
function Ib (line 26) | function Ib(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0;i=l;l=l+1040|0;...
function Jb (line 26) | function Jb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Mb(a);Nb(a);if(!d)Ob(a,112,...
function Kb (line 26) | function Kb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Mb(a);Nb(a)...
function Lb (line 26) | function Lb(a,b,c){a=a|0;b=b|0;c=c|0;Mb(a);Nb(a);Ob(a,76,b,c);return}
function Mb (line 26) | function Mb(b){b=b|0;var d=0,e=0,f=0,g=0.0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+1...
function Nb (line 26) | function Nb(a){a=a|0;Sb((c[a+16>>2]|0)+16|0);Tb(a,68683,174018);return}
function Ob (line 26) | function Ob(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;k=l...
function Pb (line 26) | function Pb(a,b){a=a|0;b=b|0;var c=0,d=0;c=l;l=l+1024|0;d=c;Qb(d,+h[b>>3...
function Qb (line 26) | function Qb(a,b){a=a|0;b=+b;var c=0,d=0;c=l;l=l+16|0;d=c;h[d>>3]=b>-1.0e...
function Rb (line 26) | function Rb(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;d=VK(b,46)|0;e=(c|0)!=0;if(...
function Sb (line 26) | function Sb(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+32|0;i=j+16|0;h...
function Tb (line 26) | function Tb(a,b,d){a=a|0;b=b|0;d=d|0;Ub(c[11344+(c[(c[a+16>>2]|0)+12>>2]...
function Ub (line 26) | function Ub(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=l;l=l+1040|0;...
function Vb (line 26) | function Vb(b,d,f,i){b=b|0;d=d|0;f=f|0;i=i|0;var j=0.0,k=0,m=0.0,n=0.0,o...
function Wb (line 26) | function Wb(a){a=a|0;Sb((c[a+16>>2]|0)+56|0);Tb(a,59744,174018);return}
function Xb (line 26) | function Xb(a,b){a=a|0;b=+b;var c=0,d=0;c=l;l=l+1024|0;d=c;Qb(d,b);fm(a,...
function Yb (line 26) | function Yb(a,b,c){a=a|0;b=+b;c=c|0;var d=0,e=0,f=0;d=l;l=l+1040|0;f=d;e...
function Zb (line 26) | function Zb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0;e=l;l=l+104...
function _b (line 26) | function _b(a){a=a|0;var b=0;switch(c[a+64>>2]|0){case 0:{b=vr(c[a>>2]|0...
function $b (line 26) | function $b(b){b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+16|0;d=f;e=c[(c[b+16>>2...
function ac (line 26) | function ac(a,b){a=a|0;b=b|0;var d=0;c[a>>2]=c[a>>2]&-9;d=Jp(a)|0;while(...
function bc (line 26) | function bc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0...
function cc (line 26) | function cc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((so(a)|0)!=(a|0)){e=b+1|...
function dc (line 26) | function dc(a,b){a=a|0;b=b|0;a=Za[c[a>>2]&31](a,b,512)|0;if(!a)a=-1;else...
function ec (line 26) | function ec(a,b){a=a|0;b=b|0;while(1){if((b|0)<=0)break;jr(a,60614)|0;b=...
function fc (line 26) | function fc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;h=l...
function gc (line 26) | function gc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0...
function hc (line 26) | function hc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l...
function ic (line 26) | function ic(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=co(a)...
function jc (line 26) | function jc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=co(a)...
function kc (line 26) | function kc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=l...
function lc (line 26) | function lc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l...
function mc (line 26) | function mc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=d+4|0;if(a[g>>0]|0)b=vB(b...
function nc (line 26) | function nc(a,b,c){a=a|0;b=b|0;c=c|0;bc(a,b,0,c);a=Jp(a)|0;while(1){if(!...
function oc (line 26) | function oc(b){b=b|0;var c=0;c=b+1|0;a:do if((a[b>>0]|0)==95){b=(a[c>>0]...
function pc (line 26) | function pc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;f=...
function qc (line 26) | function qc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0...
function rc (line 26) | function rc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0.0;j=l;l=l+4...
function sc (line 26) | function sc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0;e=l;l=l+32|0;...
function tc (line 26) | function tc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0;e=l;l=l...
function uc (line 26) | function uc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,i=0,j=0,k=0,m=0,n=0...
function vc (line 26) | function vc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;f=g;e=...
function wc (line 26) | function wc(a,b,d){a=a|0;b=b|0;d=d|0;xN(c[b+8>>2]|0);xN(b);return}
function xc (line 26) | function xc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=l;l=l+32|0;d=...
function yc (line 26) | function yc(a){a=a|0;jr(a,61453)|0;return}
function zc (line 26) | function zc(a){a=a|0;c[41902]=2;return}
function Ac (line 26) | function Ac(a){a=a|0;c[41902]=1;return}
function Bc (line 26) | function Bc(a){a=a|0;c[41902]=2;return}
function Cc (line 26) | function Cc(a){a=a|0;c[41902]=0;return}
function Dc (line 26) | function Dc(a){a=a|0;c[41902]=2;return}
function Ec (line 26) | function Ec(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0.0,m=0,n...
function Fc (line 26) | function Fc(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;n=l...
function Gc (line 26) | function Gc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0,k=0,m=0...
function Hc (line 26) | function Hc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0,k=0,m...
function Ic (line 26) | function Ic(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0...
function Jc (line 26) | function Jc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0,m=0,n...
function Kc (line 26) | function Kc(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;pr(a...
function Lc (line 26) | function Lc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0;switch(c[a+144>>2]|0){cas...
function Mc (line 26) | function Mc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,m...
function Nc (line 26) | function Nc(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0...
function Oc (line 26) | function Oc(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;d=c[41...
function Pc (line 26) | function Pc(b){b=b|0;var d=0,e=0,f=0;e=c[b+16>>2]|0;switch(c[b+64>>2]|0)...
function Qc (line 26) | function Qc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;d=c[a+16>>2]|0;e=d+...
function Rc (line 26) | function Rc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=c[a+16>>2...
function Sc (line 26) | function Sc(b,d,e,f,g,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k...
function Tc (line 26) | function Tc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=l;l=l+32|0;d=...
function Uc (line 26) | function Uc(a){a=a|0;jr(a,61453)|0;return}
function Vc (line 26) | function Vc(a){a=a|0;c[41908]=2;return}
function Wc (line 26) | function Wc(a){a=a|0;c[41908]=1;return}
function Xc (line 26) | function Xc(a){a=a|0;c[41908]=2;return}
function Yc (line 26) | function Yc(a){a=a|0;c[41908]=0;return}
function Zc (line 26) | function Zc(a){a=a|0;c[41908]=2;return}
function _c (line 26) | function _c(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0,m=0,n=0...
function $c (line 26) | function $c(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;n=l...
function ad (line 26) | function ad(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0,k=0,m=0...
function bd (line 26) | function bd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0,k=0,m...
function cd (line 26) | function cd(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0...
function dd (line 26) | function dd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0,m=0,n...
function ed (line 26) | function ed(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;pr(a...
function fd (line 26) | function fd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0;switch(c[a+144>>2]|0){cas...
function gd (line 26) | function gd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,m...
function hd (line 26) | function hd(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0...
function id (line 26) | function id(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;d=c[41...
function jd (line 26) | function jd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;d=l;l=l+16|0;b=d;jr(a,66181...
function kd (line 26) | function kd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g+8|0;e=g;jr...
function ld (line 26) | function ld(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;k=l;l=l...
function md (line 26) | function md(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;b=l;l=l+16|0;f=b;c[...
function nd (line 26) | function nd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0...
function od (line 26) | function od(a){a=a|0;var b=0,d=0,e=0;e=l;l=l+16|0;d=e;b=a+12|0;if(c[(c[b...
function pd (line 26) | function pd(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=Dn(c[(c[a+16>>...
function qd (line 26) | function qd(a){a=a|0;jr(a,77410)|0;return}
function rd (line 26) | function rd(a){a=a|0;jr(a,61967)|0;return}
function sd (line 26) | function sd(a){a=a|0;jr(a,77410)|0;return}
function td (line 26) | function td(a){a=a|0;jr(a,61967)|0;return}
function ud (line 26) | function ud(a){a=a|0;jr(a,77410)|0;return}
function vd (line 26) | function vd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;e=l;l=l+16|...
function wd (line 26) | function wd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0,j=0,k=0,m=0,n=0;m...
function xd (line 26) | function xd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+32|0;f=g;c[...
function yd (line 26) | function yd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0;j=l;l=l...
function zd (line 26) | function zd(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0...
function Ad (line 26) | function Ad(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0;g=l;l=l+16|0;f=...
function Bd (line 26) | function Bd(a,b){a=a|0;b=b|0;jr(a,61698)|0;jr(a,b)|0;jr(a,134917)|0;return}
function Cd (line 26) | function Cd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0...
function Dd (line 26) | function Dd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0;f=l;l=l+32|0;e=...
function Ed (line 26) | function Ed(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=...
function Fd (line 26) | function Fd(b){b=b|0;var d=0;jr(b,67687)|0;d=Im(c[(c[b>>2]|0)+168>>2]|0,...
function Gd (line 26) | function Gd(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0.0,k=0.0,m=0.0;i=l;l=l+4...
function Hd (line 26) | function Hd(a){a=a|0;jr(a,67514)|0;return}
function Id (line 26) | function Id(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;de(a,b,0,86543,c[(c[a+16>>2...
function Jd (line 26) | function Jd(a){a=a|0;jr(a,67362)|0;return}
function Kd (line 26) | function Kd(b){b=b|0;var d=0,e=0,f=0,g=0;e=l;l=l+16|0;f=e;g=c[b+16>>2]|0...
function Ld (line 26) | function Ld(a){a=a|0;jr(a,67362)|0;return}
function Md (line 26) | function Md(a){a=a|0;var b=0,d=0;d=c[a+16>>2]|0;b=d+8|0;de(a,c[d+212>>2]...
function Nd (line 26) | function Nd(a){a=a|0;jr(a,67362)|0;return}
function Od (line 26) | function Od(a){a=a|0;var b=0,d=0,e=0;d=c[a+16>>2]|0;b=c[a+160>>2]|0;if((...
function Pd (line 26) | function Pd(a){a=a|0;jr(a,67362)|0;return}
function Qd (line 26) | function Qd(a){a=a|0;var b=0,d=0;d=c[a+16>>2]|0;b=d+8|0;de(a,c[d+212>>2]...
function Rd (line 26) | function Rd(a){a=a|0;jr(a,67362)|0;return}
function Sd (line 26) | function Sd(b,c,d,e,f){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;jr(b,67368)|0;if(f|...
function Td (line 26) | function Td(a){a=a|0;jr(a,69192)|0;jr(a,67362)|0;return}
function Ud (line 26) | function Ud(e,f,g){e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0...
function Vd (line 26) | function Vd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;switch(c|0){case 2:{d=ae(a,...
function Wd (line 26) | function Wd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;switch(d|0){case 2:...
function Xd (line 26) | function Xd(a,d,e,f,g,h){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;g=c[a+16>>2...
function Yd (line 26) | function Yd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;jr(a,66253)|0;_d(a,0,0);jr(...
function Zd (line 26) | function Zd(a,b){a=a|0;b=b|0;jr(a,66247)|0;jr(a,ow(b)|0)|0;jr(a,68307)|0...
function _d (line 26) | function _d(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0...
function $d (line 26) | function $d(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0;g=l;l=l+16|0;f=g;a:do s...
function ae (line 26) | function ae(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p...
function be (line 26) | function be(b){b=b|0;var d=0,e=0.0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q...
function ce (line 26) | function ce(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0;i=l;l=l+16|0;g=...
function de (line 26) | function de(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;j=l...
function ee (line 26) | function ee(a){a=a|0;var b=0;jr(a,68267)|0;b=a+12|0;jr(a,oe(c[c[c[b>>2]>...
function fe (line 26) | function fe(b){b=b|0;var d=0,e=0,f=0;f=l;l=l+16|0;e=f;d=c[b+16>>2]|0;jr(...
function ge (line 26) | function ge(a){a=a|0;c[41915]=1;return}
function he (line 26) | function he(a){a=a|0;c[41915]=-1;return}
function ie (line 26) | function ie(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0;n=l...
function je (line 26) | function je(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0.0,m=0.0...
function ke (line 26) | function ke(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0;j=l;l=l...
function le (line 26) | function le(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0...
function me (line 26) | function me(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+48|...
function ne (line 26) | function ne(a,b){a=a|0;b=b|0;jr(a,67987)|0;jr(a,oe(b)|0)|0;jr(a,134917)|...
function oe (line 26) | function oe(a){a=a|0;return a|0}
function pe (line 26) | function pe(b){b=b|0;if(!(a[b+144>>0]|0))jr(b,68112)|0;else jr(b,c[b+148...
function qe (line 26) | function qe(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0;g=l;l=l+16|0;f=g;a:do s...
function re (line 26) | function re(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;g=l;l=l+16|0;f=g;h=c[a+...
function se (line 26) | function se(a){a=a|0;var b=0;jr(a,71002)|0;jr(a,71010)|0;b=a+12|0;jr(a,D...
function te (line 26) | function te(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0;j=l;l=l+32|0;i=j+24|0;g...
function ue (line 26) | function ue(a){a=a|0;jr(a,69240)|0;jr(a,69252)|0;jr(a,69260)|0;jr(a,6932...
function ve (line 26) | function ve(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;j=l...
function we (line 26) | function we(a){a=a|0;jr(a,69192)|0;return}
function xe (line 26) | function xe(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0...
function ye (line 26) | function ye(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0,k=0.0,m...
function ze (line 26) | function ze(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0,i=0.0,j=0,k=0...
function Ae (line 26) | function Ae(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;f=l...
function Be (line 26) | function Be(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0.0;k...
function Ce (line 26) | function Ce(a,b){a=a|0;b=b|0;jr(a,68295)|0;jr(a,De(b)|0)|0;jr(a,68307)|0...
function De (line 26) | function De(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0...
function Ee (line 26) | function Ee(b){b=b|0;var c=0,d=0;d=b+1|0;c=a[d>>0]|0;a:do if(c<<24>>24==...
function Fe (line 26) | function Fe(a){a=a|0;var b=0.0,d=0,e=0,f=0,g=0,i=0,j=0,k=0;k=l;l=l+48|0;...
function Ge (line 26) | function Ge(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0;g=l;l=l+16|0;f=g;a:do s...
function He (line 26) | function He(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+48|0;f=g;if(!b)...
function Ie (line 26) | function Ie(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0.0,k=0.0;i=l...
function Je (line 26) | function Je(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b+8|0;e=b;jr(a,73300...
function Ke (line 26) | function Ke(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,g=0.0,i=0.0,j=0;b=l;l=l+64|...
function Le (line 26) | function Le(a){a=a|0;jr(a,72236)|0;return}
function Me (line 26) | function Me(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0;f=l;l=l+16|0;h=...
function Ne (line 26) | function Ne(a){a=a|0;jr(a,72189)|0;return}
function Oe (line 26) | function Oe(a){a=a|0;jr(a,72171)|0;return}
function Pe (line 26) | function Pe(a){a=a|0;jr(a,72155)|0;return}
function Qe (line 26) | function Qe(a){a=a|0;jr(a,72134)|0;g[41920]=+g[41920]+-2.0;return}
function Re (line 26) | function Re(a){a=a|0;jr(a,72115)|0;return}
function Se (line 26) | function Se(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=Dn(c[(c[a+16>>...
function Te (line 26) | function Te(a){a=a|0;jr(a,72077)|0;return}
function Ue (line 26) | function Ue(a){a=a|0;jr(a,72059)|0;g[41920]=+g[41920]+-5.0;return}
function Ve (line 26) | function Ve(a){a=a|0;jr(a,72043)|0;g[41920]=+g[41920]+5.0;return}
function We (line 26) | function We(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p...
function Xe (line 26) | function Xe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,i=0.0,j=0.0,k=0.0,m=0,n...
function Ye (line 26) | function Ye(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,i=0,j=0,k=0,m=0,n=0...
function Ze (line 26) | function Ze(a,b,d,e,f,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0...
function _e (line 26) | function _e(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,i=0,j=0,k=0,m=0,n=0,o=0...
function $e (line 26) | function $e(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;pr(a...
function af (line 26) | function af(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+105...
function bf (line 26) | function bf(a,b,e){a=a|0;b=b|0;e=+e;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,...
function cf (line 26) | function cf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=l;l=l+32|0;d=...
function df (line 26) | function df(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=73943;pr(a,765...
function ef (line 26) | function ef(a){a=a|0;var b=0.0,d=0.0,e=0.0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o...
function ff (line 26) | function ff(a){a=a|0;var b=0;b=l;l=l+16|0;pr(a,74123,b);l=b;return}
function gf (line 26) | function gf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0.0,k=0,m=0.0...
function hf (line 26) | function hf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0...
function jf (line 26) | function jf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=l;l=l+16|0;nf(c[a+16>>2]|...
function kf (line 26) | function kf(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0...
function lf (line 26) | function lf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+16|0;nf(c[a+16>>2]|...
function mf (line 26) | function mf(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=73943;...
function nf (line 26) | function nf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0;switch(c[a+144>>2]|0){cas...
function of (line 26) | function of(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,m...
function pf (line 26) | function pf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=h;a:while(1)...
function qf (line 26) | function qf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;d=c[41...
function rf (line 26) | function rf(){var a=0,b=0;a=l;l=l+16|0;b=a;c[b>>2]=74104;c[b+4>>2]=76501...
function sf (line 26) | function sf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0...
function tf (line 26) | function tf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0.0,k...
function uf (line 26) | function uf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}
function vf (line 26) | function vf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0,j=0,k=0...
function wf (line 26) | function wf(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0...
function xf (line 26) | function xf(a){a=a|0;UK(c[a+52>>2]|0,c[a+56>>2]|0)|0;return}
function yf (line 26) | function yf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+80|0;f=...
function zf (line 26) | function zf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0...
function Af (line 26) | function Af(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0...
function Bf (line 26) | function Bf(a){a=a|0;var b=0,c=0;b=co(a)|0;while(1){if(!b)break;Cf(b);b=...
function Cf (line 26) | function Cf(a){a=a|0;var b=0,d=0;Oo(a,122257,304,1)|0;TA(a);HB(a,c[(c[(r...
function Df (line 26) | function Df(d){d=d|0;var e=0,f=0,g=0,h=0,i=0;Oo(d,122270,176,1)|0;UA(d)|...
function Ef (line 26) | function Ef(a){a=a|0;var b=0,d=0;Ff(c[(c[a+16>>2]|0)+192>>2]|0);d=co(a)|...
function Ff (line 26) | function Ff(b){b=b|0;var d=0,e=0,f=0,g=0;while(1){if(!b)break;f=b+16|0;g...
function Gf (line 26) | function Gf(a){a=a|0;var b=0,d=0,e=0;e=a+16|0;b=c[e>>2]|0;d=c[b+172>>2]|...
function Hf (line 26) | function Hf(a){a=a|0;var d=0,e=0,f=0,g=0,h=0;d=Jp(a)|0;while(1){if(!d)br...
function If (line 26) | function If(a){a=a|0;var b=0,d=0,e=0;e=a+16|0;d=c[e>>2]|0;b=c[d+176>>2]|...
function Jf (line 26) | function Jf(a){a=a|0;if(mn(a)|0)Kf(a);Yx(a);return}
function Kf (line 26) | function Kf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=l;l=l+48|0;g=h+32|0;f...
function Lf (line 26) | function Lf(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l...
function Mf (line 26) | function Mf(b,d){b=b|0;d=d|0;var e=0,f=0;Oo(b,122293,280,1)|0;e=sw(96)|0...
function Nf (line 26) | function Nf(a){a=a|0;var b=0,d=0,e=0;b=sw((mn(a)|0)<<4)|0;d=co(a)|0;whil...
function Of (line 26) | function Of(a){a=a|0;var b=0,d=0,e=0,f=0;e=c[(c[(co(a)|0)+16>>2]|0)+132>...
function Pf (line 26) | function Pf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=0;f=0;whi...
function Qf (line 26) | function Qf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;Oo(d,122293,280,1)|0;g=d+16...
function Rf (line 26) | function Rf(a,b){a=a|0;b=b|0;if((so(a)|0)!=(a|0))Oo(a,122293,280,1)|0;if...
function Sf (line 26) | function Sf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l...
function Tf (line 26) | function Tf(a){a=a|0;var b=0,c=0,d=0;c=Ip(a,79538,0)|0;if(c|0){b=co(c)|0...
function Uf (line 26) | function Uf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=c[(c[b+16...
function Vf (line 26) | function Vf(a){a=a|0;return c[(c[(so(a)|0)+16>>2]|0)+188>>2]|0}
function Wf (line 26) | function Wf(b,c){b=b|0;c=c|0;var d=0;d=a[b+28>>0]|0;if(a[c+28>>0]|0)if(d...
function Xf (line 26) | function Xf(a){a=a|0;Yf(a,1);return}
function Yf (line 26) | function Yf(d,e){d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0,q...
function Zf (line 26) | function Zf(a){a=a|0;var b=0,d=0,e=0.0,f=0;b=co(a)|0;while(1){if(!b)brea...
function _f (line 26) | function _f(b){b=b|0;var d=0,e=0,f=0,g=0;d=(c[b+16>>2]|0)+192|0;a:while(...
function $f (line 26) | function $f(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;h=b+-48...
function ag (line 26) | function ag(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0...
function bg (line 26) | function bg(b){b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0;f=b+16|0;d=c[f>>2]|0;if...
function cg (line 26) | function cg(a){a=a|0;var b=0,d=0;while(1){b=c[a+16>>2]|0;d=c[b+172>>2]|0...
function dg (line 26) | function dg(b,d,e,f,g,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;var...
function eg (line 26) | function eg(b,d,e,f,g,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;var...
function fg (line 26) | function fg(a){a=a|0;var b=0,d=0,e=0;b=co(a)|0;while(1){if(!b)break;d=Pm...
function gg (line 26) | function gg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=c[a+4>>2]|0;g=tw(f*48|0)|...
function hg (line 26) | function hg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;g=c[a+4>>2]|0;h=tw(...
function ig (line 26) | function ig(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0.0,j=0.0,k=0.0,m...
function jg (line 26) | function jg(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0.0,k...
function kg (line 26) | function kg(b){b=b|0;b=c[b+16>>2]|0;if((a[b+156>>0]|0)==1)if((c[b+176>>2...
function lg (line 26) | function lg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,g=0,i=0;i=l;l=l+32|0...
function mg (line 26) | function mg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0...
function ng (line 26) | function ng(b){b=b|0;var d=0,e=0;b=c[b+16>>2]|0;e=b+16|0;d=0;while(1){b=...
function og (line 26) | function og(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0...
function pg (line 26) | function pg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=c[e>>2]|0;whi...
function qg (line 26) | function qg(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0...
function rg (line 26) | function rg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[a+16>>2]|0;h[a+16>>3]=+...
function sg (line 26) | function sg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=c[a>>2]&3;i=c...
function tg (line 26) | function tg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=c[a>>2]&3;i=c...
function ug (line 26) | function ug(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0,j=0.0,k=0.0,l...
function vg (line 26) | function vg(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;h[a>>3]=b;h[a+8>>3]=c;h...
function wg (line 26) | function wg(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0...
function xg (line 26) | function xg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;d=c[d+16>>2]|0;...
function yg (line 26) | function yg(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0;d=c[a+16>>2]|0;a=c[b+16...
function zg (line 26) | function zg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;i=c[b+1...
function Ag (line 26) | function Ag(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]+ +h[c+8>>3];...
function Bg (line 26) | function Bg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0;e=+h[b+8>>3];d=+h[b...
function UA (line 27) | function UA(b){b=b|0;var d=0,e=0,f=0,g=0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q...
function VA (line 27) | function VA(a,b){a=a|0;b=b|0;h[b>>3]=+BA(a,c[42256]|0,14.0,1.0);c[b+8>>2...
function WA (line 27) | function WA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=b+8|0;if(!(c[e>>2]|0))VA(...
function XA (line 27) | function XA(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0...
function YA (line 27) | function YA(b,c){b=b|0;c=c|0;var d=0;if(((c|0)!=0?(d=Jm(b,c)|0,(d|0)!=0)...
function ZA (line 27) | function ZA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0.0,o...
function _A (line 27) | function _A(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+64|0;g=d+32|0;e...
function $A (line 27) | function $A(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0,k...
function aB (line 27) | function aB(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0...
function bB (line 27) | function bB(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}
function cB (line 27) | function cB(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]-+h[c+8>>3];h...
function dB (line 27) | function dB(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]+ +h[c+8>>3];...
function eB (line 27) | function eB(a){a=a|0;if((c[a+60>>2]|0)==(a|0))a=1;else a=(bL(Dn(a)|0,929...
function fB (line 27) | function fB(a){a=a|0;var b=0;b=Ql(22616,c[4345]|0)|0;iB(a,b);return b|0}
function gB (line 27) | function gB(a,b){a=a|0;b=b|0;a=Za[c[a>>2]&31](a,b,512)|0;if(!a)a=0;else ...
function hB (line 27) | function hB(a,b,c){a=a|0;b=b|0;c=c|0;c=an(ro(b)|0,b,c,0,1)|0;Oo(c,122270...
function iB (line 27) | function iB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+16|0;g=...
function jB (line 27) | function jB(a,b,c){a=a|0;b=b|0;c=c|0;xN(b);return}
function kB (line 27) | function kB(a){a=a|0;var b=0,c=0,d=0;d=Ip(a,93007,1)|0;Oo(d,122293,280,1...
function lB (line 27) | function lB(b,d){b=b|0;d=d|0;var e=0,f=0;e=c[b>>2]&3;f=c[((e|0)==3?b:b+4...
function mB (line 27) | function mB(a){a=a|0;var b=0,d=0,e=0;e=a+16|0;b=c[e>>2]|0;d=c[b+132>>2]|...
function nB (line 27) | function nB(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=ro(b)|0;a:do if(a[(c[b+16...
function oB (line 27) | function oB(a){a=a|0;var b=0;b=a+16|0;xN(c[(c[b>>2]|0)+144>>2]|0);pB(a);...
function pB (line 27) | function pB(a){a=a|0;var b=0,d=0,e=0;e=a+16|0;a=c[e>>2]|0;b=c[a+8>>2]|0;...
function qB (line 27) | function qB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=ym(a,b,c,0)|0;if(...
function rB (line 27) | function rB(a,b){a=a|0;b=b|0;return vJ(c[a>>2]|0,c[b>>2]|0)|0}
function sB (line 27) | function sB(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0...
function tB (line 27) | function tB(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=l;l=l+16|...
function uB (line 27) | function uB(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+32|0;h=i;d=i+8|...
function vB (line 27) | function vB(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l...
function wB (line 27) | function wB(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+1040|0;h=j;...
function xB (line 27) | function xB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0;n=l...
function yB (line 27) | function yB(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=(+h[b+8>>3]+ +h[c+8>>3]...
function zB (line 27) | function zB(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,g=0,i=0.0,j=0,k=0,m=0,n...
function AB (line 27) | function AB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0...
function BB (line 27) | function BB(a,b){a=a|0;b=b|0;if((+h[a+16>>3]>=+h[b>>3]?+h[b+16>>3]>=+h[a...
function CB (line 27) | function CB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0...
function DB (line 27) | function DB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0...
function EB (line 27) | function EB(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h;a:do i...
function FB (line 27) | function FB(d,f){d=d|0;f=f|0;var g=0;g=Im(d,94838)|0;if(g)if(!(a[g>>0]|0...
function GB (line 27) | function GB(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;var f=0.0,g=0.0,i=0....
function HB (line 27) | function HB(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0.0;f=b<<24>>24==0;b=...
function IB (line 27) | function IB(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0...
function JB (line 27) | function JB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0...
function KB (line 27) | function KB(a){a=a|0;var b=0.0,d=0.0,e=0,f=0;f=c[a>>2]&3;e=c[(c[((f|0)==...
function LB (line 27) | function LB(a,b){a=a|0;b=b|0;return (c[a>>2]|0)-(c[b>>2]|0)|0}
function MB (line 27) | function MB(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0...
function NB (line 27) | function NB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l...
function OB (line 27) | function OB(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0.0,m=0.0...
function PB (line 27) | function PB(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0;j=Ql(24680,c[43...
function QB (line 27) | function QB(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0;j=Ql(24680,c[43...
function RB (line 27) | function RB(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=e+20|...
function SB (line 27) | function SB(a){a=a|0;var b=0,d=0;d=a+20|0;aC(c[d>>2]|0);b=a+24|0;aC(c[b>...
function TB (line 27) | function TB(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0...
function UB (line 27) | function UB(b,e,f,g,i,j){b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;var k=0,m=0...
function VB (line 27) | function VB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;h[b>>3]=+h[d>>3]+ +h[b>>3];...
function WB (line 27) | function WB(a,b){a=a|0;b=b|0;var d=0.0,e=0;e=_B(c[b+24>>2]|0,a)|0;b=c[e+...
function XB (line 27) | function XB(a,b){a=a|0;b=b|0;var d=0.0,e=0;e=_B(c[b+20>>2]|0,a)|0;b=c[e+...
function YB (line 27) | function YB(a){a=a|0;return 0}
function ZB (line 27) | function ZB(a){a=a|0;return 0}
function _B (line 27) | function _B(a,b){a=a|0;b=b|0;a=Za[c[a>>2]&31](a,b+8|0,512)|0;if(!a)va(94...
function $B (line 27) | function $B(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0...
function aC (line 27) | function aC(a){a=a|0;var b=0;a=Ol(a)|0;while(1){if(!a)break;b=Ol(c[a+16>...
function bC (line 27) | function bC(a){a=a|0;var b=0;a=Ol(a)|0;while(1){if(!a)break;b=Ol(c[a+16>...
function cC (line 27) | function cC(a,b){a=a|0;b=b|0;var d=0;d=Ol(a)|0;while(1){if(!d)break;a=Ol...
function dC (line 27) | function dC(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0;e=Ol(a)|0;while(1){if(!...
function eC (line 27) | function eC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0.0,m=0.0;j=l...
function fC (line 27) | function fC(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0.0,j=0,k=0,m=0,n=0;m...
function gC (line 27) | function gC(a){a=a|0;switch(a|0){case 0:{a=95603;break}case 1:{a=95598;b...
function hC (line 27) | function hC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0...
function iC (line 27) | function iC(a,b){a=a|0;b=b|0;if(!(+h[a+8>>3]==+h[b+8>>3]))va(95674,94943...
function jC (line 27) | function jC(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0...
function kC (line 27) | function kC(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0...
function lC (line 27) | function lC(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0;while(1){if(!(iC(b,...
function mC (line 27) | function mC(a,b){a=a|0;b=b|0;if(!a)va(95610,94943,798,95614);else return...
function nC (line 27) | function nC(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;f=l;l=l+16|0;e=f;d=a[b>>0]|...
function oC (line 27) | function oC(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0...
function pC (line 27) | function pC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0,i=0.0,j=0,k=0...
function qC (line 27) | function qC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0.0,k=0...
function rC (line 27) | function rC(a,b,c){a=a|0;b=b|0;c=c|0;return ((a|0)==(c|0)?((b|0)==(c|0))...
function sC (line 27) | function sC(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((a|0)==(d|0)){b=(a|0)==0...
function tC (line 27) | function tC(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;g=c[a+28>>2]|0;h=c[a+24...
function uC (line 27) | function uC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=a+24|0;e=c[f>>2]|0;d=e+1|...
function vC (line 27) | function vC(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0;g=l;l=l+16|0;f=g;h[f...
function wC (line 27) | function wC(a,b,d){a=a|0;b=b|0;d=d|0;GC(c[b+32>>2]|0);xN(c[b+28>>2]|0);x...
function xC (line 27) | function xC(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0;e=+h[b>>3];...
function yC (line 27) | function yC(a,b,d){a=a|0;b=b|0;d=d|0;Kl(c[b+16>>2]|0)|0;xN(b);return}
function zC (line 27) | function zC(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0;f=+h[b>>3];...
function AC (line 27) | function AC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0,j=0,k=0,l=0,m=0...
function BC (line 27) | function BC(a,b){a=a|0;b=b|0;var d=0;d=c[a+20>>2]|0;if((d|0)!=(c[b+20>>2...
function CC (line 27) | function CC(a,b){a=a|0;b=b|0;var c=0.0;c=(+h[b+48>>3]+ +h[b+64>>3])*.5;h...
function DC (line 27) | function DC(b,d,e,f,g,i,j){b=b|0;d=d|0;e=+e;f=+f;g=+g;i=i|0;j=j|0;var k=...
function EC (line 27) | function EC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0;f=c[b+36>>2]|0;...
function FC (line 27) | function FC(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;d=sw(8)|0;c[d>>2]=a;e=d+4|0...
function GC (line 27) | function GC(a){a=a|0;var b=0,d=0,e=0;d=a+4|0;b=0;while(1){e=c[d>>2]|0;if...
function HC (line 27) | function HC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2...
function IC (line 27) | function IC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+16|0;f=e;c[...
function JC (line 27) | function JC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2...
function KC (line 27) | function KC(a){a=a|0;var b=0,d=0,e=0,f=0;b=c[a>>2]|0;do if(b|0){f=a+4|0;...
function LC (line 27) | function LC(a){a=a|0;var b=0;b=sw(8)|0;c[b+4>>2]=sw(a<<2)|0;c[b>>2]=-1;r...
function MC (line 27) | function MC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;i=a...
function NC (line 27) | function NC(a){a=a|0;var b=0,d=0;b=c[a>>2]|0;if((b|0)==-1)a=-1;else{d=c[...
function OC (line 27) | function OC(a){a=a|0;xN(c[a+4>>2]|0);xN(a);return}
function PC (line 27) | function PC(a,b){a=a|0;b=b|0;var d=0;d=(c[a>>2]|0)+1|0;c[a>>2]=d;c[(c[a+...
function QC (line 27) | function QC(a){a=a|0;var d=0,e=0,f=0;e=c[a>>2]|0;c[a+8>>2]=e;c[a+12>>2]=...
function RC (line 27) | function RC(a){a=a|0;var d=0,e=0,f=0;d=c[a+8>>2]|0;c[a>>2]=d;c[a+4>>2]=c...
function SC (line 27) | function SC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=sw(((c[a>>2]|0)*6|0)+(b<<...
function TC (line 27) | function TC(a){a=a|0;var b=0;b=sw(24)|0;c[b>>2]=0;c[b+16>>2]=sw(a*40|0)|...
function UC (line 27) | function UC(a){a=a|0;var b=0,d=0;d=c[a+16>>2]|0;b=c[a>>2]|0;c[d+(b*40|0)...
function VC (line 27) | function VC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,g=0;g=a+4|0;f=c[g>>2...
function WC (line 27) | function WC(a,d){a=a|0;d=d|0;var e=0,f=0;e=a+16|0;f=b[e>>1]|0;c[(c[a+28>...
function XC (line 27) | function XC(a){a=a|0;var b=0;b=a+16|0;xN(c[(c[b>>2]|0)+28>>2]|0);xN(c[b>...
function YC (line 27) | function YC(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0...
function ZC (line 27) | function ZC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[b+12>>2]|0;if((e|0)==(c...
function _C (line 27) | function _C(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=c[a>>2]|0;Gr(...
function $C (line 27) | function $C(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(!(fr(a)|0))if((b|0)!=...
function aD (line 27) | function aD(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+4>>2]|0,d|...
function bD (line 27) | function bD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0.0,j=0.0,k...
function cD (line 27) | function cD(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0...
function dD (line 27) | function dD(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+8>>2]|...
function eD (line 27) | function eD(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+12>>2]|0,d...
function fD (line 27) | function fD(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+24>>2]|0,d...
function gD (line 27) | function gD(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+28>>2]|0,d...
function hD (line 27) | function hD(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+16>>2]|0,d...
function iD (line 27) | function iD(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+20>>2]|0,d...
function jD (line 27) | function jD(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+32>>2]...
function kD (line 27) | function kD(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+36>>2]...
function lD (line 27) | function lD(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+40>>2]|0,d...
function mD (line 27) | function mD(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+44>>2]|0,d...
function nD (line 27) | function nD(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+48>>2]|0,d...
function oD (line 27) | function oD(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+52>>2]|0,d...
function pD (line 27) | function pD(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+56>>2]...
function qD (line 27) | function qD(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+60>>2]|0,d...
function rD (line 27) | function rD(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+64>>2]...
function sD (line 27) | function sD(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+68>>2]|0,d...
function tD (line 27) | function tD(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=c[a+6...
function uD (line 27) | function uD(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+76>>2]|0,d...
function vD (line 27) | function vD(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+60>>2]|0;if(d|0?(e=c[d+80...
function wD (line 27) | function wD(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+84>>2]|0,d...
function xD (line 27) | function xD(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;k=l...
function yD (line 27) | function yD(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=c[b+60>>2]|0;g=(c...
function zD (line 27) | function zD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l...
function AD (line 27) | function AD(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=c[b+60>>2]|0;g=(c...
function BD (line 27) | function BD(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,h=0,i=0,j=0;h=c[a+60...
function CD (line 27) | function CD(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0;m=l;l=l+16|...
function DD (line 27) | function DD(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0;j=l;l=l...
function ED (line 27) | function ED(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0...
function FD (line 27) | function FD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+64|0;f=e;c[...
function GD (line 27) | function GD(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0...
function HD (line 27) | function HD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=c[a+60>>2]|0;do i...
function ID (line 27) | function ID(b,d){b=b|0;d=d|0;var e=0,f=0;e=c[b+60>>2]|0;if((d|0?!((e|0)=...
function JD (line 27) | function JD(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0.0,k...
function KD (line 27) | function KD(b){b=b|0;if(a[b>>0]|0)if(SK(b,96003)|0)if(SK(b,96009)|0)if(!...
function LD (line 27) | function LD(a,b){a=a|0;b=+b;if(c[a+60>>2]|0)h[(c[a+16>>2]|0)+152>>3]=b;r...
function MD (line 27) | function MD(a,b){a=a|0;b=b|0;b=Gr(a,1,b)|0;if(!b)b=999;else{b=c[b+16>>2]...
function ND (line 27) | function ND(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;f=...
function OD (line 27) | function OD(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0...
function PD (line 27) | function PD(a,b){a=a|0;b=b|0;b=Gr(c[a>>2]|0,4,b)|0;if(!b)b=999;else{b=c[...
function QD (line 27) | function QD(a){a=a|0;return 1}
function RD (line 27) | function RD(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+336|0;h[c>>3]=+h[c>>3]+10...
function SD (line 27) | function SD(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+336|0;h[c>>3]=+h[c>>3]-10...
function TD (line 27) | function TD(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+344|0;h[c>>3]=+h[c>>3]-10...
function UD (line 27) | function UD(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+344|0;h[c>>3]=+h[c>>3]+10...
function VD (line 27) | function VD(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+352|0;h[c>>3]=+h[c>>3]*1....
function WD (line 27) | function WD(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+352|0;h[c>>3]=+h[c>>3]/1....
function XD (line 27) | function XD(b){b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0;e=b+536|0;d=(a[e>>0]|0)...
function YD (line 27) | function YD(b){b=b|0;var d=0,e=0;d=c[(c[b>>2]|0)+168>>2]|0;e=b+580|0;if(...
function ZD (line 27) | function ZD(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,m...
function _D (line 27) | function _D(b,c,d){b=b|0;c=c|0;d=d|0;a[b+538>>0]=0;a[b+541>>0]=0;return}
function $D (line 27) | function $D(b,d){b=b|0;d=d|0;var e=0.0,f=0,g=0.0,i=0.0,j=0.0,k=0,m=0,n=0...
function aE (line 27) | function aE(a,b,c){a=a|0;b=b|0;c=c|0;return}
function bE (line 27) | function bE(a){a=a|0;return}
function cE (line 27) | function cE(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=c[b>>2]|0...
function dE (line 27) | function dE(a,b){a=a|0;b=b|0;a=c[a>>2]|0;is(a,c[a+168>>2]|0,b)|0;return}
function eE (line 27) | function eE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=c[a>>2]|0...
function fE (line 27) | function fE(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0.0,j=0.0,k=0.0,m=0;f=l;l...
function gE (line 27) | function gE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0.0;e=+h[b+...
function hE (line 27) | function hE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g;e=co(a...
function iE (line 27) | function iE(b){b=b|0;var d=0;d=c[b+576>>2]|0;a:do if(d|0)switch(Co(d)|0)...
function jE (line 27) | function jE(b){b=b|0;var d=0,e=0;e=b+584|0;d=c[e>>2]|0;if(d|0){xN(d);c[e...
function kE (line 27) | function kE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0.0,o...
function lE (line 27) | function lE(b){b=b|0;var d=0,e=0,f=0;f=b+580|0;d=c[f>>2]|0;a:do if(d|0)s...
function mE (line 27) | function mE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=a+592|0;do if((so(b)|...
function nE (line 27) | function nE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;f=a+592|0;Br(f,0,96...
function oE (line 27) | function oE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=a...
function pE (line 27) | function pE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=qE(a,b,c[d>>2]|0)...
function qE (line 27) | function qE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=tw(12)|0;if(!b)b=0;else b...
function rE (line 27) | function rE(b,c){b=b|0;c=c|0;sE(b);a[b+44>>0]=0;tE(b)|0;qA(b)|0;return}
function sE (line 27) | function sE(b){b=b|0;var d=0,e=0;d=c[b+32>>2]|0;a:do if(d|0)while(1){e=c...
function tE (line 27) | function tE(a){a=a|0;var b=0;b=Gr(a,2,96330)|0;if(!b)a=999;else{c[a+148>...
function uE (line 27) | function uE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;a=c[a+148>>2]|0;if((a|0)!=0...
function vE (line 27) | function vE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return (c[b>>2]|0)-(c[d>>2]...
function wE (line 27) | function wE(a){a=a|0;var b=0.0,d=0.0;a=c[a+16>>2]|0;d=+h[a+16>>3];b=+h[a...
function xE (line 27) | function xE(a){a=a|0;var b=0,c=0;if(!a)a=-1;else{b=a>>>0>65535;c=b?a>>>1...
function yE (line 27) | function yE(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0.0,j=0.0,k=0...
function zE (line 27) | function zE(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0...
function AE (line 27) | function AE(a){a=a|0;var b=0;b=LE(a)|0;if((b|0)>=0){ME(a);NE(a);b=Kl(c[a...
function BE (line 27) | function BE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0.0,j=0,k=0.0,m...
function CE (line 27) | function CE(a){a=a|0;kH(c[a+24>>2]|0)|0;xN(a);return}
function DE (line 27) | function DE(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0.0,j=0,k=0,m=0,n...
function EE (line 27) | function EE(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,g=0.0;a=c[a+32>>2]|0;...
function FE (line 27) | function FE(a,b){a=a|0;b=b|0;var d=0.0,e=0.0;a=c[a+32>>2]|0;e=+h[a+16>>3...
function GE (line 27) | function GE(a,b){a=a|0;b=b|0;var d=0.0,e=0.0;e=+h[a>>3];c[b>>2]=~~e;d=+h...
function HE (line 27) | function HE(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;i...
function IE (line 27) | function IE(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;var g=0.0,h=0.0,i=0,...
function JE (line 27) | function JE(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;var g=0.0,h=0.0,i=0,...
function KE (line 27) | function KE(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0;e=c[b+3...
function LE (line 27) | function LE(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0...
function ME (line 27) | function ME(a){a=a|0;var b=0,d=0,e=0;d=a+20|0;e=c[d>>2]|0;b=a+24|0;a=Za[...
function NE (line 27) | function NE(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;e=a+20|0;f=Sl(c[e>>2]|0...
function OE (line 27) | function OE(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0.0,i=0,j=0,k=0,l=0.0...
function PE (line 27) | function PE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;f=0;e=c[a>>2]|0...
function QE (line 27) | function QE(b){b=b|0;var d=0,e=0,f=0,g=0;d=TK(b)|0;if(d>>>0>=(c[42442]|0...
function RE (line 27) | function RE(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,i=0.0,j=0.0,k=0,m=0.0,n=0,o...
function SE (line 27) | function SE(a,b,c,d,e,f){a=+a;b=+b;c=+c;d=d|0;e=e|0;f=f|0;var g=0.0,i=0....
function TE (line 27) | function TE(a,b,c,d,e,f,g){a=+a;b=+b;c=+c;d=d|0;e=e|0;f=f|0;g=g|0;h[d>>3...
function UE (line 27) | function UE(a,b,c,d,e,f){a=+a;b=+b;c=+c;d=d|0;e=e|0;f=f|0;var g=0.0,i=0....
function VE (line 27) | function VE(b){b=b|0;var d=0,e=0;d=a[b>>0]|0;if(((d<<24>>24!=98?(e=b+1|0...
function WE (line 27) | function WE(a,b){a=a|0;b=b|0;return SK(c[a>>2]|0,c[b>>2]|0)|0}
function XE (line 27) | function XE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+16|0;e=f;g=TK(a...
function YE (line 27) | function YE(a){a=a|0;c[42447]=a;return}
function ZE (line 27) | function ZE(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;var f=0,g=0;f=l;l=l+208...
function _E (line 27) | function _E(a,b,c,d,e,f,g){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;g=+g;var i=0,j...
function $E (line 27) | function $E(a){a=a|0;var b=0,c=0.0,d=0,e=0.0,f=0.0,g=0.0,i=0.0,j=0,k=0,l...
function aF (line 27) | function aF(a,b,c){a=a|0;b=+b;c=+c;var d=0.0,e=0.0,f=0.0,g=0.0,i=0.0;e=(...
function bF (line 27) | function bF(a,b,d){a=a|0;b=+b;d=+d;var e=0;c[42450]=100;e=sw(1600)|0;c[a...
function cF (line 27) | function cF(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0;f=c[a>>2]|0;e=(c[a+4>>2]|...
function dF (line 27) | function dF(a,b,d,e,f,g,i){a=a|0;b=+b;d=+d;e=+e;f=+f;g=+g;i=+i;var j=0,k...
function eF (line 27) | function eF(a){a=a|0;var b=0;b=c[a>>2]|0;cF(a,+h[b>>3],+h[b+8>>3]);c[a>>...
function fF (line 27) | function fF(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0.0;e=+h[a+16>>3];c=+h[a+24...
function gF (line 27) | function gF(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0.0,f=0.0,g=0.0,i=0.0,j=0.0...
function hF (line 27) | function hF(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0.0,f=0,g=0,i=0,j=0,k=0,l=0...
function iF (line 27) | function iF(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0,j=0,k=0.0,m=0,n=0...
function jF (line 27) | function jF(a){a=a|0;var d=0,e=0;a=St(a)|0;d=c[a>>2]|0;e=c[d+4>>2]|0;c[a...
function kF (line 27) | function kF(b){b=b|0;var d=0.0,e=0,f=0;switch(a[b+4>>0]|0){case 1:{e=c[b...
function lF (line 27) | function lF(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p...
function mF (line 27) | function mF(f,g,i){f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0...
function nF (line 27) | function nF(a){a=a|0;var b=0;b=c[a+16>>2]|0;c[b+208>>2]=0;c[b+228>>2]=0;...
function oF (line 27) | function oF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0;i=a+16|0;f=c[...
function pF (line 27) | function pF(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0...
function qF (line 27) | function qF(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0,j=0;j...
function rF (line 27) | function rF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0,j=0.0,k=0...
function sF (line 27) | function sF(f,g,i){f=f|0;g=g|0;i=i|0;var j=0,k=0.0,m=0.0,n=0,o=0,p=0,q=0...
function tF (line 27) | function tF(f,g,i,j,k){f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;var m=0.0,n=0,o=0,p...
function uF (line 27) | function uF(e,f,g){e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0...
function vF (line 27) | function vF(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=c[d+16>>2]|0;f=h+208|...
function wF (line 27) | function wF(a,b){a=a|0;b=b|0;var d=0.0,e=0;e=c[b>>2]|0;if(e|0)c[a+16>>2]...
function xF (line 27) | function xF(a,b,d,e){a=a|0;b=b|0;d=+d;e=+e;var f=0,g=0,i=0;f=l;l=l+64|0;...
function yF (line 27) | function yF(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0.0,k=0.0,m=0.0,n...
function zF (line 27) | function zF(d,e,f,g,i,j,k,m){d=d|0;e=e|0;f=f|0;g=g|0;i=+i;j=j|0;k=k|0;m=...
function AF (line 27) | function AF(a){a=a|0;xN(c[a>>2]|0);xN(c[a+4>>2]|0);xN(c[a+8>>2]|0);xN(c[...
function BF (line 27) | function BF(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(a|0){j=a+4|0...
function CF (line 27) | function CF(a){a=a|0;xN(c[a+32>>2]|0);xN(a);return}
function DF (line 27) | function DF(b,d){b=b|0;d=d|0;switch(a[b+4>>0]|0){case 1:{EF(c[b>>2]|0);b...
function EF (line 27) | function EF(a){a=a|0;var b=0,d=0,e=0;e=a+84|0;if((c[a+100>>2]|0)==-1)Kl(...
function FF (line 27) | function FF(a){a=a|0;DF(a+88|0,0);AF(a);xN(a);return}
function GF (line 27) | function GF(b,e,f){b=b|0;e=e|0;f=f|0;var g=0;b=c[(c[(c[b+16>>2]|0)+104>>...
function HF (line 27) | function HF(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+4>>2]|0;if(!((d|0)!=0?(SK...
function IF (line 27) | function IF(b,d){b=b|0;d=d|0;var e=0;e=c[b+4>>2]|0;if(!((e|0)!=0?(SK(e,d...
function JF (line 27) | function JF(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 0}
function KF (line 27) | function KF(d){d=d|0;var f=0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r...
function LF (line 27) | function LF(a){a=a|0;var b=0,d=0;d=l;l=l+16|0;b=d;if(a>>>0<21)a=c[54832+...
function MF (line 27) | function MF(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0...
function NF (line 27) | function NF(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,i=0;h=an(a,d,f,0,0)...
function OF (line 27) | function OF(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[(c[a+16>>2]|0)+...
function PF (line 27) | function PF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=a+92|0;e=0;f=...
function QF (line 27) | function QF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+16|0;f=g+4|0;b=g;c[...
function RF (line 27) | function RF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b+16>>2]|0)+192|0;whil...
function SF (line 27) | function SF(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0...
function TF (line 27) | function TF(b,d){b=b|0;d=d|0;var e=0;a:do switch(Co(b)|0){case 0:{fm(d,D...
function UF (line 27) | function UF(b){b=b|0;var c=0,d=0;c=Im(b,122547)|0;if(!((c|0)!=0?(a[c>>0]...
function VF (line 27) | function VF(f,g,i,j){f=f|0;g=g|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0...
function WF (line 27) | function WF(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;h[a>>3]=b;h[a+8>>3]=c;h...
function XF (line 27) | function XF(f,g,i){f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0.0,o=0.0,p=0,q=0...
function YF (line 27) | function YF(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0.0,k=0.0,m=0,n=0,o=0...
function ZF (line 28) | function ZF(f,g,i){f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0...
function _F (line 28) | function _F(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>...
function $F (line 28) | function $F(d,e){d=d|0;e=e|0;var f=0,g=0,h=0;g=b[d+4>>1]|0;f=0;while(1){...
function aG (line 28) | function aG(d,f,g){d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0...
function bG (line 28) | function bG(f,g,i,j){f=f|0;g=g|0;i=i|0;j=j|0;var k=0.0,m=0.0,n=0,o=0,p=0...
function cG (line 28) | function cG(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var f=0,g=0,h=0,i=0,j=0;j=d...
function dG (line 28) | function dG(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0,j=0,k=0,m=0;m=l;l=l...
function eG (line 28) | function eG(){return Ql(54916,c[4345]|0)|0}
function fG (line 28) | function fG(a,b,d){a=a|0;b=b|0;d=d|0;d=sw(12)|0;c[d>>2]=c[b>>2];return d|0}
function gG (line 28) | function gG(a,b,c){a=a|0;b=b|0;c=c|0;xN(b);return}
function hG (line 28) | function hG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=c[b>>2]|0;e=c[d>>2]|0;ret...
function iG (line 28) | function iG(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;Za[c...
function jG (line 28) | function jG(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;b=(Z...
function kG (line 28) | function kG(a){a=a|0;var b=0;if(!(c[42452]|0)){b=sw((a<<2)+4|0)|0;c[4245...
function lG (line 28) | function lG(){xN(c[42452]|0);c[42452]=0;c[42464]=0;return}
function mG (line 28) | function mG(){c[42464]=0;return}
function nG (line 28) | function nG(){var a=0,b=0,d=0;b=c[42464]|0;d=c[42452]|0;a=1;while(1){if(...
function oG (line 28) | function oG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;f=c[42452]|0;g=c[f+(a<<...
function pG (line 28) | function pG(a){a=a|0;var b=0,d=0;d=l;l=l+16|0;b=c[42464]|0;if((b|0)==(c[...
function qG (line 28) | function qG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=c...
function rG (line 28) | function rG(){var a=0,b=0,d=0,e=0;b=c[42464]|0;if(!b)a=0;else{e=c[42452]...
function sG (line 28) | function sG(a,b){a=a|0;b=b|0;c[a>>2]=b;oG(c[a+4>>2]|0);nG();return}
function tG (line 28) | function tG(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0...
function uG (line 28) | function uG(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+8|0;e=c[d>>2]|0;c[d>>2]=e+1...
function vG (line 28) | function vG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0.0,o...
function wG (line 28) | function wG(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0,j=0,k...
function xG (line 28) | function xG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0,o...
function yG (line 28) | function yG(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=Za[c[...
function zG (line 28) | function zG(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0;j=b+32|0;k=b+36|0;a...
function AG (line 28) | function AG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0.0,j=0,k=0,l=0,m...
function BG (line 28) | function BG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;i=...
function CG (line 28) | function CG(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0;e=+h[b+8>>3...
function DG (line 28) | function DG(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0;e=+h[b>>3];...
function EG (line 28) | function EG(a){a=a|0;var b=0,d=0;d=a+8|0;xN(c[(c[d>>2]|0)+36>>2]|0);b=a+...
function FG (line 28) | function FG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0...
function GG (line 28) | function GG(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0...
function HG (line 28) | function HG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=0;while(1){if((d|...
function IG (line 28) | function IG(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0...
function JG (line 28) | function JG(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0;g=+h[(+...
function KG (line 28) | function KG(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0;f=c[a+4>>2]|0;do if((c[...
function LG (line 28) | function LG(a,b,d,e,f,g,i,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i...
function MG (line 28) | function MG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0...
function NG (line 28) | function NG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,h=0,i=0,j=0.0...
function OG (line 28) | function OG(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0,i=0.0,j...
function PG (line 28) | function PG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0...
function QG (line 28) | function QG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0...
function RG (line 28) | function RG(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0...
function SG (line 28) | function SG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0...
function TG (line 28) | function TG(a){a=a|0;var b=0.0;b=+(a|0);a=0;while(1){if(!(b>=1.0))break;...
function UG (line 28) | function UG(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+(a|0);c=d;a=0;while(1){i...
function VG (line 28) | function VG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0.0,k=0...
function WG (line 28) | function WG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if(!(c[b+(a...
function XG (line 28) | function XG(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0,j=0.0...
function YG (line 28) | function YG(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0,i=0.0,j=0...
function ZG (line 28) | function ZG(a,b,d){a=a|0;b=b|0;d=d|0;return c[b+((c[((d|0)==1?b+(a*56|0)...
function _G (line 28) | function _G(a){a=a|0;var b=0,d=0,e=0;e=l;l=l+16|0;d=e;b=c[42472]|0;if((b...
function $G (line 28) | function $G(){var a=0;a=c[42473]|0;if((a|0)<(c[42470]|0)){c[42473]=a+1;r...
function aH (line 28) | function aH(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+h[a+8>>3];d=+h[b+8>>3];i...
function bH (line 28) | function bH(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+h[a+8>>3];d=+h[b+8>>3];i...
function cH (line 28) | function cH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0...
function dH (line 28) | function dH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0;e=+h[b+8>>3];f=+h[d...
function eH (line 28) | function eH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0;e=+h[b+8>>3];f=+h[d...
function fH (line 28) | function fH(a){a=a|0;var b=0;b=sw(8)|0;if(b|0){c[b+4>>2]=a;c[b>>2]=0}ret...
function gH (line 28) | function gH(a,b){a=a|0;b=b|0;if(b){b=fH(b)|0;c[b>>2]=a;a=b}return a|0}
function hH (line 28) | function hH(a){a=a|0;var b=0;do{b=a;a=c[a>>2]|0;xN(b)}while((a|0)!=0);re...
function iH (line 28) | function iH(){var a=0;a=sw(1992)|0;if(a|0)c[a>>2]=jH(a)|0;return a|0}
function jH (line 28) | function jH(a){a=a|0;var b=0;b=pH(a)|0;c[b+4>>2]=0;a=a+1972|0;c[a>>2]=(c...
function kH (line 28) | function kH(a){a=a|0;lH(a,c[a>>2]|0);xN(c[a>>2]|0);xN(a);return 0}
function lH (line 28) | function lH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;g=a+1936|0;h=a+...
function mH (line 28) | function mH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;if(!b)va(12...
function nH (line 28) | function nH(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0...
function oH (line 28) | function oH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0...
function pH (line 28) | function pH(a){a=a|0;a=a+1968|0;c[a>>2]=(c[a>>2]|0)+1;a=wN(1288)|0;qH(a)...
function qH (line 28) | function qH(a){a=a|0;var b=0;c[a>>2]=0;c[a+4>>2]=-1;b=0;while(1){if((b|0...
function rH (line 28) | function rH(a){a=a|0;wH(a);c[a+16>>2]=0;return}
function sH (line 28) | function sH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+32|0;g=...
function tH (line 28) | function tH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0...
function uH (line 28) | function uH(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if(!b)va(12...
function vH (line 28) | function vH(a,b){a=a|0;b=b|0;if(!((a|0)!=0&b>>>0<64))va(123607,123545,20...
function wH (line 28) | function wH(a){a=a|0;var b=0;b=0;while(1){if((b|0)==4)break;c[a+(b<<2)>>...
function xH (line 28) | function xH(a){a=a|0;var b=0,d=0,e=0;e=l;l=l+16|0;d=e;c[d>>2]=1;c[d+8>>2...
function yH (line 28) | function yH(a){a=a|0;var b=0,d=0,e=0;if(!a)va(123648,123650,128,123662);...
function zH (line 28) | function zH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=l;l=l...
function AH (line 28) | function AH(a,b){a=a|0;b=b|0;var d=0,e=0;if((a|0)!=0&(b|0)!=0)d=0;else v...
function BH (line 28) | function BH(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0;if(...
function CH (line 28) | function CH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;h=l;l=l...
function DH (line 28) | function DH(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0...
function EH (line 28) | function EH(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;if(!b)va(123706...
function FH (line 28) | function FH(a){a=a|0;var b=0,d=0,e=0,f=0;d=l;l=l+16|0;e=d;c[a+1848>>2]=0...
function GH (line 28) | function GH(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0...
function HH (line 28) | function HH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|...
function IH (line 28) | function IH(){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=...
function JH (line 28) | function JH(b,d){b=b|0;d=d|0;var e=0;e=sw(8)|0;a[e+4>>0]=d;c[e>>2]=b;ret...
function KH (line 28) | function KH(){var a=0,b=0;a=c[42479]|0;b=c[42477]|0;if(b|0){DF(b,1);c[42...
function LH (line 28) | function LH(){var a=0,d=0,e=0,f=0,g=0,h=0;e=c[42483]|0;f=sw(40)|0;if(Sl(...
function MH (line 28) | function MH(b){b=b|0;var d=0,e=0,f=0;e=sw(64)|0;f=b+4|0;d=c[f>>2]|0;if(d...
function NH (line 28) | function NH(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=sw(32)|0;j=c[4248...
function OH (line 28) | function OH(a){a=a|0;var b=0,d=0.0,e=0,f=0,g=0,i=0,j=0;j=l;l=l+32|0;g=j;...
function PH (line 28) | function PH(){var a=0,b=0;b=c[42480]|0;a=c[b+4>>2]|0;xN(b);c[42480]=a;re...
function QH (line 28) | function QH(b){b=b|0;var c=0;while(1){c=a[b>>0]|0;if(!(c<<24>>24)){b=0;b...
function RH (line 28) | function RH(){var b=0,d=0,e=0;e=Ql(55068,c[4344]|0)|0;b=c[42479]|0;d=sw(...
function SH (line 28) | function SH(){var a=0;a=c[(c[42479]|0)+84>>2]|0;return Za[c[a>>2]&31](a,...
function TH (line 28) | function TH(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=sw(16)|0;f=c[4247...
function UH (line 28) | function UH(a,b,c){a=a|0;b=b|0;c=c|0;xN(b);return}
function VH (line 28) | function VH(a,b,d){a=a|0;b=b|0;d=d|0;Kl(c[b+8>>2]|0)|0;xN(b);return}
function WH (line 28) | function WH(a,b,d){a=a|0;b=b|0;d=d|0;$H(c[b+8>>2]|0);xN(b);return}
function XH (line 28) | function XH(a){a=a|0;Kl(c[a+84>>2]|0)|0;AF(a);xN(a);return}
function YH (line 28) | function YH(a,b,d){a=a|0;b=b|0;d=d|0;xN(c[b+8>>2]|0);xN(b);return}
function ZH (line 28) | function ZH(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=d+12|0;a=b[g>>1]|...
function _H (line 28) | function _H(){var a=0,b=0;a=c[42480]|0;while(1){b=c[a+4>>2]|0;if(!b)brea...
function $H (line 28) | function $H(b){b=b|0;var d=0;d=b+88|0;switch(a[b+92>>0]|0){case 1:{XH(c[...
function aI (line 28) | function aI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=l;l=l+160|0;e=f+8...
function bI (line 28) | function bI(b){b=b|0;var d=0,e=0;e=l;l=l+16|0;d=e;if(!(a[169936]|0)){a[1...
function cI (line 28) | function cI(){Ua()}
function dI (line 28) | function dI(a,b,d){a=a|0;b=b|0;d=d|0;a=l;l=l+16|0;if(!(c[42485]|0)){_l(0...
function eI (line 28) | function eI(){return 1}
function fI (line 28) | function fI(){return -1}
function gI (line 28) | function gI(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0...
function hI (line 28) | function hI(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,g=0.0;d=+h[b>>3];e=b+8|...
function iI (line 28) | function iI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g+16|0;e=g;i...
function jI (line 28) | function jI(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0...
function kI (line 28) | function kI(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[b>>3]-+h[a>>3];c=+h[b+...
function lI (line 28) | function lI(a){a=+a;var b=0.0;b=1.0-a;return +(b*(a*3.0*b))}
function mI (line 28) | function mI(a,b,d){a=a|0;b=b|0;d=+d;var e=0;h[b>>3]=+h[b>>3]*d;e=b+8|0;h...
function nI (line 28) | function nI(a){a=+a;return +((1.0-a)*(a*3.0*a))}
function oI (line 28) | function oI(a,b,d,e,f,g,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0...
function pI (line 28) | function pI(a,b,d,e,f,g,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j...
function qI (line 28) | function qI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;h[b>>3]=+h[d>>3]+ +h[b>>3];...
function rI (line 28) | function rI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;h[b>>3]=+h[b>>3]-+h[d>>3];e...
function sI (line 28) | function sI(a){a=+a;a=1.0-a;return +(a*(a*a))}
function tI (line 28) | function tI(a){a=+a;return +(a*a*a)}
function uI (line 28) | function uI(a,b){a=a|0;b=b|0;var c=0.0,d=0,e=0.0,f=0.0,g=0;c=0.0;d=1;whi...
function vI (line 28) | function vI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0...
function wI (line 28) | function wI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0.0,k=0.0,m...
function xI (line 28) | function xI(a,b,c,d,e){a=+a;b=+b;c=+c;d=+d;e=e|0;c=c*3.0;h[e+24>>3]=b*3....
function yI (line 28) | function yI(a,b,d){a=+a;b=b|0;d=d|0;var e=0;if(a>=0.0&a<=1.0){e=c[d>>2]|...
function zI (line 28) | function zI(a,b){a=a|0;b=b|0;return +(+h[a>>3]*+h[b>>3]+ +h[a+8>>3]*+h[b...
function AI (line 28) | function AI(a){a=+a;var b=0.0;b=1.0-a;return +(b*b*(b+a*3.0))}
function BI (line 28) | function BI(a){a=+a;return +(a*a*((1.0-a)*3.0+a))}
function CI (line 28) | function CI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0.0,j=0,k=0,m=0,n...
function DI (line 28) | function DI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+64|0;g=...
function EI (line 28) | function EI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g+16|0;e=g;i...
function FI (line 28) | function FI(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0;e=+h[b+8>>3];d=+h[b...
function GI (line 28) | function GI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=...
function HI (line 28) | function HI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0...
function II (line 28) | function II(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=c[42579]|0;d=0;e=0;while(...
function JI (line 28) | function JI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[42579]|0;e=d+(a*52|0)|0...
function KI (line 28) | function KI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g+16|0;e=g;i...
function LI (line 28) | function LI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=c[42574]|0;e=c[42573]...
function MI (line 28) | function MI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=c[42575]|0;g=c[42571]|0;b...
function NI (line 28) | function NI(a,b){a=a|0;b=b|0;c[((a|0)==1?170296:170292)>>2]=b;return}
function OI (line 28) | function OI(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0...
function PI (line 28) | function PI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[42570]|0;f=...
function QI (line 28) | function QI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g+16|0;e=g;i...
function RI (line 28) | function RI(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;f=FI(a,...
function SI (line 28) | function SI(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0;e=+h[a>...
function TI (line 28) | function TI(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0,g=0.0,i=0.0,j=0;d...
function UI (line 28) | function UI(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+h[a+16>>3];do if(!(c<1.0...
function VI (line 28) | function VI(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a+8>>3];c=+h[a>>3];if(...
function WI (line 28) | function WI(a){a=a|0;xN(c[a>>2]|0);xN(a);return}
function XI (line 28) | function XI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0...
function YI (line 28) | function YI(){return 170340}
function ZI (line 28) | function ZI(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=eJ(c[a+60>>2]|...
function _I (line 28) | function _I(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0...
function $I (line 28) | function $I(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=l;l=l+32|0;g=f;e=...
function aJ (line 28) | function aJ(a){a=a|0;if(a>>>0>4294963200){c[(bJ()|0)>>2]=0-a;a=-1}return...
function bJ (line 28) | function bJ(){return (cJ()|0)+64|0}
function cJ (line 28) | function cJ(){return dJ()|0}
function dJ (line 28) | function dJ(){return 55556}
function eJ (line 28) | function eJ(a){a=a|0;return a|0}
function fJ (line 28) | function fJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;k=l...
function gJ (line 28) | function gJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+32|0;f=g;c[b+36...
function hJ (line 28) | function hJ(a){a=a|0;var b=0;b=(iJ(a)|0)==0;return (b?a:a|32)|0}
function iJ (line 28) | function iJ(a){a=a|0;return (a+-65|0)>>>0<26|0}
function jJ (line 28) | function jJ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0...
function kJ (line 28) | function kJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;c[a+104>>2]=b;d=c[a+8>>2]|0...
function lJ (line 28) | function lJ(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0...
function mJ (line 28) | function mJ(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=b+104|0;j=c[f>>2]...
function nJ (line 28) | function nJ(a){a=a|0;return ((a|0)==32|(a+-9|0)>>>0<5)&1|0}
function oJ (line 28) | function oJ(a){a=a|0;var b=0,e=0;e=l;l=l+16|0;b=e;if((pJ(a)|0)==0?(Za[c[...
function pJ (line 28) | function pJ(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=...
function qJ (line 28) | function qJ(a,b,c){a=a|0;b=b|0;c=c|0;c=jJ(a,b,c,-1,0)|0;return c|0}
function rJ (line 28) | function rJ(a,b,c){a=a|0;b=b|0;c=c|0;c=jJ(a,b,c,-2147483648,0)|0;return ...
function sJ (line 28) | function sJ(a,b){a=+a;b=+b;var d=0.0,e=0,f=0,g=0,i=0,k=0.0,m=0,n=0,o=0,p...
function tJ (line 28) | function tJ(a,b,c){a=a|0;b=b|0;c=+c;var d=0.0,e=0.0;e=c*134217729.0;e=e+...
function uJ (line 28) | function uJ(a,b){a=+a;b=+b;var d=0,e=0;h[j>>3]=a;e=c[j>>2]|0;d=c[j+4>>2]...
function vJ (line 28) | function vJ(b,c){b=b|0;c=c|0;var d=0,e=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<2...
function wJ (line 28) | function wJ(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;a:do if(!d)b=0;else{whi...
function xJ (line 28) | function xJ(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;if(!d)e=0;else{...
function yJ (line 28) | function yJ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2...
function zJ (line 28) | function zJ(a,b,c){a=a|0;b=b|0;c=c|0;return AJ(a,2147483647,b,c)|0}
function AJ (line 28) | function AJ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0...
function BJ (line 28) | function BJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0...
function CJ (line 28) | function CJ(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0...
function DJ (line 28) | function DJ(a){a=a|0;return 0}
function EJ (line 28) | function EJ(a){a=a|0;return}
function FJ (line 28) | function FJ(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))$J(b,d,a)|0;return}
function GJ (line 28) | function GJ(b){b=b|0;var d=0,e=0,f=0;e=c[b>>2]|0;f=(a[e>>0]|0)+-48|0;if(...
function HJ (line 28) | function HJ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0;a:do if(b>>>0<=20...
function IJ (line 28) | function IJ(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;if(!((b|0)==0&(c|0)==0))do{...
function JJ (line 28) | function JJ(b,c,d){b=b|0;c=c|0;d=d|0;if(!((b|0)==0&(c|0)==0))do{d=d+-1|0...
function KJ (line 28) | function KJ(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if(c>>>0>0|(c|0)==0&b>>>0>4...
function LJ (line 28) | function LJ(a){a=a|0;return WJ(a,c[(VJ()|0)+188>>2]|0)|0}
function MJ (line 28) | function MJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=d&255;f=(e|0)...
function NJ (line 28) | function NJ(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l...
function OJ (line 28) | function OJ(a,b){a=a|0;b=b|0;if(!a)a=0;else a=TJ(a,b,0)|0;return a|0}
function PJ (line 28) | function PJ(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,...
function QJ (line 28) | function QJ(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;D=c[j+4>>2]|0;return b|0}
function RJ (line 28) | function RJ(a,b){a=+a;b=b|0;return +(+SJ(a,b))}
function SJ (line 28) | function SJ(a,b){a=+a;b=b|0;var d=0,e=0,f=0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+...
function TJ (line 28) | function TJ(b,d,e){b=b|0;d=d|0;e=e|0;do if(b){if(d>>>0<128){a[b>>0]=d;b=...
function UJ (line 28) | function UJ(){return dJ()|0}
function VJ (line 28) | function VJ(){return dJ()|0}
function WJ (line 28) | function WJ(b,e){b=b|0;e=e|0;var f=0,g=0;g=0;while(1){if((d[126645+g>>0]...
function XJ (line 28) | function XJ(a,b){a=a|0;b=b|0;return YJ(a,b)|0}
function YJ (line 28) | function YJ(a,b){a=a|0;b=b|0;if(!b)b=0;else b=ZJ(c[b>>2]|0,c[b+4>>2]|0,a...
function ZJ (line 28) | function ZJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0...
function _J (line 28) | function _J(a,b){a=a|0;b=b|0;var c=0;c=VN(a|0)|0;return ((b|0)==0?a:c)|0}
function $J (line 28) | function $J(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=e+16|0;g=...
function aK (line 28) | function aK(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=...
function bK (line 28) | function bK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+20|0;f=c[e>>2]|0;a=...
function cK (line 28) | function cK(a){a=a|0;return ((a+-48|0)>>>0<10|(dK(a)|0)!=0)&1|0}
function dK (line 28) | function dK(a){a=a|0;return ((a|32)+-97|0)>>>0<26|0}
function eK (line 28) | function eK(a){a=a|0;return ((a|0)==32|(a|0)==9)&1|0}
function fK (line 28) | function fK(a){a=a|0;if(!(gK(a)|0))a=(hK(a)|0)!=0;else a=1;return a&1|0}
function gK (line 28) | function gK(a){a=a|0;return (a+-48|0)>>>0<10|0}
function hK (line 28) | function hK(a){a=a|0;if(a>>>0<131072)a=(d[128537+((d[128537+(a>>>8)>>0]|...
function iK (line 28) | function iK(a){a=a|0;return eK(a)|0}
function jK (line 28) | function jK(a){a=a|0;return ((a+-65529|0)>>>0<3|((a&-2|0)==8232|(a>>>0<3...
function kK (line 28) | function kK(a,b){a=a|0;b=b|0;do switch(b|0){case 1:{a=fK(a)|0;break}case...
function lK (line 28) | function lK(a){a=a|0;if(!(pK(a)|0))a=(nK(a)|0)!=0;else a=0;return a&1|0}
function mK (line 28) | function mK(a){a=a|0;return (wK(a)|0)!=(a|0)|0}
function nK (line 28) | function nK(a){a=a|0;if(a>>>0>=255)if((a+-57344|0)>>>0<8185|(a>>>0<8232|...
function oK (line 28) | function oK(a){a=a|0;if(a>>>0<131072)a=(d[131513+((d[131513+(a>>>8)>>0]|...
function pK (line 28) | function pK(a){a=a|0;if(!a)a=0;else a=(uK(56184,a)|0)!=0;return a&1|0}
function qK (line 28) | function qK(a){a=a|0;return (sK(a)|0)!=(a|0)|0}
function rK (line 28) | function rK(a){a=a|0;return ((a+-48|0)>>>0<10|((a|32)+-97|0)>>>0<6)&1|0}
function sK (line 28) | function sK(a){a=a|0;return tK(a,1)|0}
function tK (line 28) | function tK(c,f){c=c|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=(f<<1)+-1...
function uK (line 28) | function uK(a,b){a=a|0;b=b|0;var d=0,e=0;if(!b)a=a+((vK(a)|0)<<2)|0;else...
function vK (line 28) | function vK(a){a=a|0;var b=0;b=a;while(1)if(!(c[b>>2]|0))break;else b=b+...
function wK (line 28) | function wK(a){a=a|0;return tK(a,0)|0}
function xK (line 28) | function xK(b){b=b|0;var c=0,d=0,e=0,f=0;e=a[b>>0]|0;c=1;d=134681;f=97;w...
function yK (line 28) | function yK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+48|0;f=g+40|0;e...
function zK (line 28) | function zK(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;d=b;e=134754;f=d+15|0;do{a[...
function AK (line 28) | function AK(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0...
function BK (line 28) | function BK(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0...
function CK (line 28) | function CK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=a+4|0;if(b>>>0>31){e=c[f>...
function DK (line 28) | function DK(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var...
function EK (line 28) | function EK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=a+4|0;if(b>>>0>31){e=c[a>...
function FK (line 28) | function FK(a){a=a|0;var b=0;b=GK((c[a>>2]|0)+-1|0)|0;if(!b){b=GK(c[a+4>...
function GK (line 28) | function GK(a){a=a|0;var b=0;if(a)if(!(a&1)){b=a;a=0;do{a=a+1|0;b=b>>>1}...
function HK (line 28) | function HK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=l;l=l+256...
function IK (line 28) | function IK(b,e,f){b=b|0;e=e|0;f=f|0;var g=0.0,h=0,i=0,j=0,k=0,l=0,m=0,n...
function JK (line 28) | function JK(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0.0,i=0,j=0,k...
function Fk (line 29) | function Fk(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0...
function Gk (line 29) | function Gk(b){b=b|0;var d=0;d=c[b>>2]&3;if((a[(c[(c[((d|0)==3?b:b+48|0)...
function Hk (line 29) | function Hk(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=Lk(c[((c[d>>2]&3|...
function Ik (line 29) | function Ik(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0...
function Jk (line 29) | function Jk(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0,j=0.0;i=d+16|0;g=c[...
function Kk (line 29) | function Kk(a){a=a|0;var b=0;b=fh(a)|0;Dk(a,b);return b|0}
function Lk (line 29) | function Lk(b){b=b|0;var d=0;d=c[b+16>>2]|0;if((a[d+159>>0]|0)==7)b=c[(c...
function Mk (line 29) | function Mk(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=V...
function Nk (line 29) | function Nk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=Ok(a)|0;e=Ok(b)|0;Pk(...
function Ok (line 29) | function Ok(b){b=b|0;var d=0,e=0,f=0;d=c[b+16>>2]|0;e=c[d+212>>2]|0;if((...
function Pk (line 29) | function Pk(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0...
function Qk (line 29) | function Qk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=b+16|0;b=c[d>>2]|0;e=c[b+...
function Rk (line 29) | function Rk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;h=a...
function Sk (line 29) | function Sk(a){a=a|0;var b=0;Fk(a);b=c[a+16>>2]|0;c[b+220>>2]=1;c[c[b+21...
function Tk (line 29) | function Tk(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function Uk (line 29) | function Uk(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=a+16|0;d=c[i>>2]|0;h=...
function Vk (line 29) | function Vk(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l...
function Wk (line 29) | function Wk(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=e+16|0;g=sw((...
function Xk (line 29) | function Xk(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=(c[(c...
function Yk (line 29) | function Yk(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=co(b)|0;while(1){if(!h)br...
function Zk (line 29) | function Zk(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=b+16|0;d=1;while(1){f...
function _k (line 29) | function _k(a){a=a|0;var b=0,c=0,d=0;d=fB(a)|0;c=co(a)|0;while(1){if(!c)...
function $k (line 29) | function $k(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0...
function al (line 29) | function al(b,d){b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if((b|0)!=0?(a...
function bl (line 29) | function bl(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a>>3];if((+h[b>>3]<=d?...
function cl (line 29) | function cl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0,j=0,k=0...
function dl (line 29) | function dl(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=(+h[b+8>>3]+ +h[c+8>>3]...
function el (line 29) | function el(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,g=0,i=0,j=0,k=0,m=0;m=l...
function fl (line 29) | function fl(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;var g=0.0,i=0,j=...
function gl (line 29) | function gl(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;var g=0.0,i=0,j=...
function hl (line 29) | function hl(a,b){a=a|0;b=+b;var c=0,d=0,e=0,f=0.0,g=0,i=0;f=+h[a+8>>3];e...
function il (line 29) | function il(a,b){a=a|0;b=+b;var c=0,d=0,e=0,f=0.0,g=0,i=0;f=+h[a>>3];e=f...
function jl (line 29) | function jl(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0;c=l;l=l+16|0;d=c;e=+h[a+8...
function kl (line 29) | function kl(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0,r=0...
function ll (line 29) | function ll(b){b=b|0;b=c[b+16>>2]|0;if(((a[b+156>>0]|0)==1?(c[b+176>>2]|...
function ml (line 29) | function ml(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+80|0;h=...
function nl (line 29) | function nl(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0...
function ol (line 29) | function ol(b){b=b|0;b=c[b+16>>2]|0;if(((a[b+156>>0]|0)==1?(c[b+184>>2]|...
function pl (line 29) | function pl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+80|0;h=...
function ql (line 29) | function ql(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0...
function rl (line 29) | function rl(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[b+16>>2]|0;a=(c[(c[a+16>>2]...
function sl (line 29) | function sl(b,d){b=b|0;d=d|0;var e=0,f=0;while(1){f=c[b+16>>2]|0;if(!(a[...
function tl (line 29) | function tl(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+544...
function ul (line 29) | function ul(a,b,d){a=a|0;b=b|0;d=d|0;c[b>>2]=d;c[b+4>>2]=d+512;c[b+12>>2...
function vl (line 29) | function vl(a){a=a|0;c[(c[a+16>>2]|0)+192>>2]=0;c[41985]=0;return}
function wl (line 29) | function wl(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0...
function xl (line 29) | function xl(a){a=a|0;var b=0,d=0,e=0,f=0;d=a+16|0;a=c[d>>2]|0;f=a+220|0;...
function yl (line 29) | function yl(a){a=a|0;var b=0;a=c[(c[a>>2]|0)+12>>2]|0;while(1){if(!a)bre...
function zl (line 29) | function zl(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;h=...
function Al (line 29) | function Al(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=a+8|0;b=c[f>>2]|0;d=a+4|0...
function Bl (line 29) | function Bl(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=c[b+16>>2]|0;g=f+232|0;c[...
function Cl (line 29) | function Cl(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0...
function Dl (line 29) | function Dl(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=c[b>>2]&3;i=c[((d|0)=...
function El (line 29) | function El(a){a=a|0;var d=0,e=0,f=0,g=0;g=a+16|0;a=c[g>>2]|0;if(b[a+236...
function Fl (line 29) | function Fl(b){b=b|0;var d=0,e=0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p...
function Gl (line 29) | function Gl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0...
function Hl (line 29) | function Hl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=a+16|0;e=...
function Il (line 29) | function Il(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;a=c[(c[a+16>>2]|0)+...
function Jl (line 29) | function Jl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0...
function Kl (line 29) | function Kl(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;do if((a|0)!=0?(c[a+24>...
function Ll (line 29) | function Ll(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0...
function Ml (line 29) | function Ml(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;a=(c|0)==0;do if(!b)if(a)a=...
function Nl (line 29) | function Nl(a){a=a|0;var b=0,d=0,e=0;e=a+8|0;b=c[e>>2]|0;d=c[b>>2]|0;a:d...
function Ol (line 29) | function Ol(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=a+8|0;b=c[g>>2]|0;d=c[b>>...
function Pl (line 29) | function Pl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0...
function Ql (line 29) | function Ql(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l...
function Rl (line 29) | function Rl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=c[c[a...
function Sl (line 29) | function Sl(a){a=a|0;var b=0,d=0,e=0;b=a+8|0;d=c[b>>2]|0;if(c[d>>2]&4096...
function Tl (line 29) | function Tl(a){a=a|0;var b=0;if(!a)return 0;else{b=Tl(c[a+4>>2]|0)|0;ret...
function Ul (line 29) | function Ul(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0;g=c;if((e|0)>=1){h=...
function Vl (line 29) | function Vl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0...
function Wl (line 29) | function Wl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;if(c[c[a+8>>2]>>2]&...
function Xl (line 29) | function Xl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0...
function Yl (line 29) | function Yl(a){a=a|0;var b=0;b=c[41986]|0;c[41986]=a;return b|0}
function Zl (line 29) | function Zl(a){a=a|0;var b=0;b=c[41987]|0;c[41987]=a;return b|0}
function _l (line 29) | function _l(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2...
function $l (line 29) | function $l(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=...
function am (line 29) | function am(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((c[41992]|0)==0?...
function bm (line 29) | function bm(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;$l(1...
function cm (line 29) | function cm(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=b+12|0;if(!e){d=(d|0)==0?...
function dm (line 29) | function dm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=a+8|0;g=c[a>>...
function em (line 29) | function em(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=a+4|0;e=c[f>>2]|0;if(...
function fm (line 29) | function fm(a,b){a=a|0;b=b|0;return em(a,b,TK(b)|0)|0}
function gm (line 29) | function gm(a){a=a|0;if(c[a+12>>2]|0)xN(c[a>>2]|0);return}
function hm (line 29) | function hm(a){a=a|0;var b=0,e=0;b=a+4|0;e=c[b>>2]|0;if(e>>>0>(c[a>>2]|0...
function im (line 29) | function im(a,b,d){a=a|0;b=b|0;d=d|0;cp(c[41994]|0,c[b+8>>2]|0)|0;cp(c[4...
function jm (line 29) | function jm(a,b){a=a|0;b=b|0;var c=0;c=Mo(a,81395,0)|0;if((b|0)!=0&(c|0)...
function km (line 29) | function km(a){a=a|0;var b=0,c=0,d=0;d=so(a)|0;wq(d,d,86,0,1)|0;c=co(d)|...
function lm (line 29) | function lm(b){b=b|0;var c=0;c=b+24|0;a[c>>0]=a[c>>0]|64;sm(b);c=Lp(b)|0...
function mm (line 29) | function mm(a,b){a=a|0;b=b|0;var d=0;d=om(b)|0;if(!((d|0)!=0?(c[d+8>>2]|...
function nm (line 29) | function nm(a,b){a=a|0;b=b|0;var d=0;d=om(b)|0;if(!((d|0)!=0?(c[d+8>>2]|...
function om (line 29) | function om(a){a=a|0;return Mo(a,c[4364]|0,0)|0}
function pm (line 29) | function pm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=Oo(b,c[4364]|0,16,0)|0;f=...
function qm (line 29) | function qm(a,b){a=a|0;b=b|0;var d=0,e=0;e=l;l=l+16|0;d=e;a=jm(a,0)|0;a:...
function rm (line 29) | function rm(a){a=a|0;var b=0;b=so(ro(a)|0)|0;a=qm(b,c[a>>2]&3)|0;if(!a)a...
function sm (line 29) | function sm(a){a=a|0;var b=0,d=0,e=0,f=0;d=Oo(a,81395,20,0)|0;e=d+8|0;c[...
function tm (line 29) | function tm(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=Za[c[b>>2]&31...
function um (line 29) | function um(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=Yn(b,24)|...
function vm (line 29) | function vm(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+32|0;e=d;c[e+8>>2]=b;b=...
function wm (line 29) | function wm(a,b){a=a|0;b=b|0;var c=0;c=Wl(a,0)|0;b=vm(a,b)|0;Wl(a,c)|0;r...
function xm (line 29) | function xm(a,b){a=a|0;b=b|0;a=om(a)|0;if(!a)a=0;else a=vm(c[a+8>>2]|0,b...
function ym (line 29) | function ym(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=...
function zm (line 29) | function zm(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=so(a)...
function Am (line 29) | function Am(a,b,c){a=a|0;b=b|0;c=c|0;a=qm(a,b)|0;if(!a)a=0;else a=vm(a,c...
function Bm (line 29) | function Bm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;b=om(b)|0;f=d+16|0;...
function Cm (line 29) | function Cm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=ro(a)|0;g...
function Dm (line 29) | function Dm(a,b,d){a=a|0;b=b|0;d=d|0;a=qm(a,b)|0;do if(a){b=c[a>>2]|0;if...
function Em (line 29) | function Em(a){a=a|0;var b=0;c[41994]=a;b=om(a)|0;if(b|0){Fm(a,b);Qo(a,c...
function Fm (line 29) | function Fm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=ro(a)|0;e=rm(a)|0;b=b+12|...
function Gm (line 29) | function Gm(a){a=a|0;var b=0;b=om(a)|0;if(b|0){Fm(a,b);Qo(a,c[4364]|0)|0...
function Hm (line 29) | function Hm(a){a=a|0;var b=0;b=om(a)|0;if(b|0){Fm(a,b);Qo(a,c[4364]|0)|0...
function Im (line 29) | function Im(a,b){a=a|0;b=b|0;b=xm(a,b)|0;if(!b)b=0;else{a=c[(om(a)|0)+12...
function Jm (line 29) | function Jm(a,b){a=a|0;b=b|0;a=c[(om(a)|0)+12>>2]|0;return c[a+(c[b+16>>...
function Km (line 29) | function Km(a,b,c){a=a|0;b=b|0;c=c|0;b=xm(a,b)|0;if(!b)b=-1;else{Cm(a,b,...
function Lm (line 29) | function Lm(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=ro(a)|0;f=ym(f,c[...
function Mm (line 29) | function Mm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=ro(a)|0;f=c[a>>2]|0;a...
function Nm (line 29) | function Nm(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;a=c[b+40>>2]|0;...
function Om (line 29) | function Om(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;a=(c[b+...
function Pm (line 29) | function Pm(a,b){a=a|0;b=b|0;var d=0;b=Qm(a,b)|0;if(!b)b=0;else{d=a+44|0...
function Qm (line 29) | function Qm(a,b){a=a|0;b=b|0;var d=0,e=0;e=l;l=l+48|0;d=e;if((c[b+24>>2]...
function Rm (line 29) | function Rm(a,b){a=a|0;b=b|0;var d=0,e=0;d=Qm(a,c[((c[b>>2]&3|0)==3?b:b+...
function Sm (line 29) | function Sm(a,b){a=a|0;b=b|0;var d=0;b=Qm(a,b)|0;if(!b)b=0;else{d=a+44|0...
function Tm (line 29) | function Tm(a,b){a=a|0;b=b|0;var d=0,e=0;d=Qm(a,c[((c[b>>2]&3|0)==2?b:b+...
function Um (line 29) | function Um(a,b){a=a|0;b=b|0;var c=0;c=Pm(a,b)|0;if(!c)c=Sm(a,b)|0;retur...
function Vm (line 29) | function Vm(a,b,d){a=a|0;b=b|0;d=d|0;a:do if((c[b>>2]&3|0)==2){b=Rm(a,b)...
function Wm (line 29) | function Wm(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+32|0;f=h+16...
function Xm (line 29) | function Xm(a,b){a=a|0;b=b|0;Zm(a,b);return}
function Ym (line 29) | function Ym(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0...
function Zm (line 29) | function Zm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;i=l...
function _m (line 29) | function _m(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+48|...
function $m (line 29) | function $m(a,b,d){a=a|0;b=b|0;d=d|0;Rl(a,c[b>>2]|0)|0;Za[c[a>>2]&31](a,...
function an (line 29) | function an(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0...
function bn (line 29) | function bn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;d=(c[b>>2]&3|0)...
function cn (line 29) | function cn(a,b,d){a=a|0;b=b|0;d=d|0;Rl(a,c[b>>2]|0)|0;Za[c[a>>2]&31](a,...
function dn (line 29) | function dn(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+16|0;f=e;d=(c[d...
function en (line 29) | function en(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;e=...
function fn (line 29) | function fn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=b+8|0;e=d+8|0;e=FN(c[b>>2...
function gn (line 29) | function gn(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;h=l;l=l...
function hn (line 29) | function hn(b){b=b|0;var d=0,e=0,f=0,g=0;d=(b|0)!=0;if(d){e=c[b>>2]|0;e=...
function jn (line 29) | function jn(b){b=b|0;var d=0,e=0;c[b+36>>2]=Pp(b,17852,c[4353]|0)|0;c[b+...
function kn (line 29) | function kn(a,b){a=a|0;b=b|0;var d=0;d=(c[a+64>>2]|0)+24+(b<<3)|0;b=d;b=...
function ln (line 29) | function ln(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;f=Lp(b)|0;g=(f|0)==0;h=b+64...
function mn (line 29) | function mn(a){a=a|0;return Sl(c[a+40>>2]|0)|0}
function nn (line 29) | function nn(a){a=a|0;var b=0,c=0,d=0;b=0;c=co(a)|0;while(1){if(!c)break;...
function on (line 29) | function on(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=Qm(a,b)|0;if(f){a...
function pn (line 29) | function pn(a,b){a=a|0;b=b|0;var d=0;Rl(a,c[b>>2]|0)|0;d=Sl(a)|0;c[b>>2]...
function qn (line 29) | function qn(b){b=b|0;return a[b+24>>0]&1|0}
function rn (line 29) | function rn(a){a=a|0;return (qn(a)|0)==0|0}
function sn (line 29) | function sn(a){a=a|0;return (d[a+24>>0]|0)>>>1&1|0}
function tn (line 29) | function tn(a,b){a=a|0;b=b|0;return a|0}
function un (line 29) | function un(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;if(!d){f=1328;d=c[f...
function vn (line 29) | function vn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 0}
function wn (line 29) | function wn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((c&1|0)==0&0==0)cp(a,c)|...
function xn (line 29) | function xn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ((c&1|0)==0&0==0?c:0...
function yn (line 29) | function yn(a){a=a|0;return}
function zn (line 29) | function zn(a,b,c){a=a|0;b=b|0;c=c|0;return}
function An (line 29) | function An(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0...
function Bn (line 29) | function Bn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[a+64>>2]|0;return jb[c[...
function Cn (line 29) | function Cn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Ln(a,b,d,e)|0;a=c[a+64>>2]|...
function Dn (line 29) | function Dn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h;d=ro(a...
function En (line 29) | function En(a,b,d){a=a|0;b=b|0;d=d|0;a=c[a+64>>2]|0;hb[c[(c[a+4>>2]|0)+2...
function Fn (line 29) | function Fn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l...
function Gn (line 29) | function Gn(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=Yn(a,...
function Hn (line 29) | function Hn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=b+16|0;b=c[a>>2]|0;a=c[a+...
function In (line 29) | function In(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=c[b+24>>2]|0;e=c[d+24>>2]...
function Jn (line 29) | function Jn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=Kn(a,b,d,e)|0;if(!a)a=0;e...
function Kn (line 29) | function Kn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+32|0;f=...
function Ln (line 29) | function Ln(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=(b|0)==3?2:b;b=Kn...
function Mn (line 29) | function Mn(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;c[41994]=b;g=c[b+64>>2]...
function Nn (line 29) | function Nn(a){a=a|0;c[41994]=a;a=a+64|0;On((c[a>>2]|0)+56|0);On((c[a>>2...
function On (line 29) | function On(a){a=a|0;var b=0,d=0,e=0;b=0;while(1){if((b|0)==3)break;d=a+...
function Pn (line 29) | function Pn(a,b,c){a=a|0;b=b|0;c=c|0;if(!(DL(b,c,a)|0))a=0;else a=TK(b)|...
function Qn (line 29) | function Qn(a,b){a=a|0;b=b|0;return nL(b,a)|0}
function Rn (line 29) | function Rn(a){a=a|0;return BL(a)|0}
function Sn (line 29) | function Sn(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+32|0;e=b+12|0;d=b;c[4447]=c...
function Tn (line 29) | function Tn(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;if((e|0)!=0?(h=...
function Un (line 29) | function Un(a){a=a|0;return 0}
function Vn (line 29) | function Vn(a,b){a=a|0;b=b|0;a=wN(b)|0;GN(a|0,0,b|0)|0;return a|0}
function Wn (line 29) | function Wn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;a=zN(b,d)|0;if(d>>>0>c>>>0)...
function Xn (line 29) | function Xn(a,b){a=a|0;b=b|0;xN(b);return}
function Yn (line 29) | function Yn(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;a=c[a+64>>2]|0;a=lb[c[...
function Zn (line 29) | function Zn(a,b){a=a|0;b=b|0;if(b|0){a=c[a+64>>2]|0;cb[c[(c[a>>2]|0)+12>...
function _n (line 29) | function _n(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=(c[b+16>>2]|0)+8|0;b=c[a>...
function $n (line 29) | function $n(a,b,d){a=a|0;b=b|0;d=d|0;a=c[b+16>>2]|0;if((a+28|0)!=(b|0))Z...
function ao (line 29) | function ao(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=(c[c[b+16>>2]>>2]|0)>>>4;...
function bo (line 29) | function bo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=167056;c[e>>2]=b;c[e+4>>2...
function co (line 29) | function co(a){a=a|0;a=c[a+36>>2]|0;a=Za[c[a>>2]&31](a,0,128)|0;if(!a)a=...
function eo (line 29) | function eo(a,b){a=a|0;b=b|0;var d=0;b=Qm(a,b)|0;if((b|0)!=0?(d=c[a+36>>...
function fo (line 29) | function fo(a){a=a|0;a=c[a+36>>2]|0;a=Za[c[a>>2]&31](a,0,256)|0;if(!a)a=...
function go (line 29) | function go(a,b){a=a|0;b=b|0;var d=0;b=Qm(a,b)|0;if((b|0)!=0?(d=c[a+36>>...
function ho (line 29) | function ho(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=bo(a,b,c)|0;d...
function io (line 29) | function io(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=so(a)|0;if((e|0)==(c[b+24...
function jo (line 29) | function jo(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;g=Yn(b,...
function ko (line 29) | function ko(a,b){a=a|0;b=b|0;do{mo(a,b);a=Lp(a)|0}while((a|0)!=0);return}
function lo (line 29) | function lo(b,c){b=b|0;c=c|0;if(a[(so(b)|0)+24>>0]&64)mm(b,c);to(b,c);re...
function mo (line 29) | function mo(a,b){a=a|0;b=b|0;var d=0,e=0;e=a+40|0;Sl(c[e>>2]|0)|0;if((so...
function no (line 29) | function no(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l...
function oo (line 29) | function oo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;c[42008]=b;d=Um(a,b)|0;whil...
function po (line 29) | function po(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=d+8|0;e=f;if(bo(b,c[e>>2]...
function qo (line 29) | function qo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;e=h;d=...
function ro (line 29) | function ro(a){a=a|0;var b=0;switch(c[a>>2]&3){case 2:case 3:{b=c[(c[a+4...
function so (line 29) | function so(a){a=a|0;var b=0;switch(c[a>>2]&3){case 2:case 3:{b=(c[a+40>...
function to (line 29) | function to(b,d){b=b|0;d=d|0;var e=0;e=c[b+64>>2]|0;if(!(a[e+52>>0]|0))D...
function uo (line 29) | function uo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;a:do if(d|0){uo(a,b,c[d+8>>...
function vo (line 29) | function vo(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=c[b+64>>2]|0;if(!(a[f+52>...
function wo (line 29) | function wo(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;a:do if(e|0){wo(a,b...
function xo (line 29) | function xo(b,d){b=b|0;d=d|0;var e=0;e=c[b+64>>2]|0;if(!(a[e+52>>0]|0))D...
function yo (line 29) | function yo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;a:do if(d|0){yo(a,b,c[d+8>>...
function zo (line 29) | function zo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=Yn(a,12)|0;c[e>>2]=b;c[e+...
function Ao (line 29) | function Ao(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=(c[a+64>>2]|0)+48|0;d=c[e...
function Bo (line 29) | function Bo(a,b){a=a|0;b=b|0;var d=0;d=so(a)|0;a:do if((d|0)==(so(b)|0))...
function Co (line 29) | function Co(a){a=a|0;return c[a>>2]&3|0}
function Do (line 29) | function Do(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|...
function Eo (line 29) | function Eo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;e=g;a:...
function Fo (line 29) | function Fo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+32|0;e=d;f=Jo(b)|0;...
function Go (line 29) | function Go(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=Yn(ro(d)|0,32...
function Ho (line 29) | function Ho(a,b,d){a=a|0;b=b|0;d=d|0;a=b+24|0;while(1){a=c[a>>2]|0;if(!a...
function Io (line 29) | function Io(a,b){a=a|0;b=b|0;b=Fo(a,b)|0;if(b|0)Za[c[a>>2]&31](a,b,2)|0;...
function Jo (line 29) | function Jo(a){a=a|0;a=a+8|0;D=c[a+4>>2]|0;return c[a>>2]|0}
function Ko (line 29) | function Ko(a,b,d){a=a|0;b=b|0;d=d|0;Lo(b);Zn(c[b+16>>2]|0,b);return}
function Lo (line 29) | function Lo(a){a=a|0;var b=0,d=0;b=a+16|0;a=c[a+24>>2]|0;while(1){if(!a)...
function Mo (line 29) | function Mo(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l...
function No (line 29) | function No(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;c[a+16>>2]=b;e=c[a>>2]|0;d=...
function Oo (line 29) | function Oo(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=ro(a)|0;f...
function Po (line 29) | function Po(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[a+16>>2]|0;do if(d){e=d...
function Qo (line 29) | function Qo(a,b){a=a|0;b=b|0;var d=0,e=0;e=ro(a)|0;d=Mo(a,b,0)|0;if(!d)b...
function Ro (line 29) | function Ro(a,b){a=a|0;b=b|0;var d=0;a=c[a+16>>2]|0;do{d=a+4|0;a=c[d>>2]...
function So (line 29) | function So(a,b,d){a=a|0;b=b|0;d=d|0;if((c[b+16>>2]|0)==(d|0)){a=c[d+4>>...
function To (line 29) | function To(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=(d|0)...
function Uo (line 29) | function Uo(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;a:do switch(b|0){case 0...
function Vo (line 29) | function Vo(a,b,c){a=a|0;b=b|0;c=c|0;Qo(b,c)|0;return}
function Wo (line 29) | function Wo(a){a=a|0;var b=0,d=0,e=0;d=ro(a)|0;b=a+16|0;a=c[b>>2]|0;if(a...
function Xo (line 29) | function Xo(a){a=a|0;return Rp(a,Yo(a)|0)|0}
function Yo (line 29) | function Yo(a){a=a|0;var b=0,d=0;if(!a)d=168052;else d=(c[a+64>>2]|0)+20...
function Zo (line 29) | function Zo(a,b){a=a|0;b=b|0;return _o(Yo(a)|0,b)|0}
function _o (line 29) | function _o(a,b){a=a|0;b=b|0;a=$o(a,b)|0;if(!a)a=0;else a=c[a+16>>2]|0;r...
function $o (line 29) | function $o(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+32|0;e=d;c[e+16>>2]=b;b...
function ap (line 29) | function ap(a,b){a=a|0;b=b|0;var d=0,e=0;if(!b)d=0;else{e=Yo(a)|0;d=$o(e...
function bp (line 29) | function bp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if(!b)d=0;else{e=Yo(a)|...
function cp (line 29) | function cp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if((b|0)!=0?(d=Yo(a)|0,...
function dp (line 29) | function dp(a){a=a|0;var b=0;if(!a)a=0;else{a=a+-12|0;b=167112;a=c[b>>2]...
function ep (line 29) | function ep(a){a=a|0;var b=0,d=0,e=0;if(a|0){d=167112;a=a+-12|0;e=a;b=c[...
function fp (line 29) | function fp(a){a=a|0;c[42018]=a;c[4490]=1;return}
function gp (line 29) | function gp(a,b){a=a|0;b=b|0;c[42019]=a;c[42020]=b;c[42021]=0;return}
function hp (line 29) | function hp(){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if(!(c[42022]|...
function ip (line 29) | function ip(){var a=0,b=0,d=0;b=c[42024]|0;do if(!b){a=Bp(4)|0;c[42024]=...
function jp (line 29) | function jp(a,b){a=a|0;b=b|0;var d=0;d=Bp(48)|0;if(!d)up(81911);c[d+12>>...
function kp (line 29) | function kp(){var b=0,d=0;d=(c[42024]|0)+(c[42025]<<2)|0;b=c[d>>2]|0;c[4...
function lp (line 29) | function lp(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0;g=l;l=l+32|0;f=g;d=g+16|0;...
function mp (line 29) | function mp(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=l;l=l+2080|0;i=j...
function np (line 29) | function np(){var b=0;b=c[42031]|0;if(!b){b=wN(1024)|0;c[42031]=b;c[4203...
function op (line 29) | function op(){c[42045]=ap(c[41994]|0,c[42031]|0)|0;a[c[42031]>>0]=0;return}
function pp (line 29) | function pp(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=c[42032]|0;d=c[42031]...
function qp (line 29) | function qp(){c[42045]=bp(c[41994]|0,c[42031]|0)|0;a[c[42031]>>0]=0;return}
function rp (line 29) | function rp(){var d=0,e=0,f=0,g=0,h=0;h=c[42026]|0;g=c[42016]|0;e=(c[(c[...
function sp (line 29) | function sp(a){a=a|0;var d=0;if(b[56696+(a<<1)>>1]|0){d=c[42026]|0;c[420...
function tp (line 29) | function tp(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;i=...
function up (line 29) | function up(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=c[13857]|0;c[b>>2]=a;OL(...
function vp (line 29) | function vp(a,b){a=a|0;b=b|0;return zN(a,b)|0}
function wp (line 29) | function wp(a){a=a|0;var b=0,d=0,e=0;d=c[42024]|0;if((d|0)!=0?(b=c[d+(c[...
function xp (line 29) | function xp(a,b){a=a|0;b=b|0;var d=0;d=c[(bJ()|0)>>2]|0;yp(a);c[a>>2]=b;...
function yp (line 29) | function yp(b){b=b|0;var d=0;if(b|0){c[b+16>>2]=0;d=b+4|0;a[c[d>>2]>>0]=...
function zp (line 29) | function zp(){var b=0,d=0;d=c[42016]|0;b=(c[42017]|0)+-2|0;while(1){if((...
function Ap (line 29) | function Ap(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[42034]|0;if((d|0)<(b|0)){e=...
function Bp (line 29) | function Bp(a){a=a|0;return wN(a)|0}
function Cp (line 29) | function Cp(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+211...
function Dp (line 29) | function Dp(){Ep(c[42016]|0);return}
function Ep (line 29) | function Ep(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=c[420...
function Fp (line 29) | function Fp(){var a=0;a=c[42024]|0;if(!a)a=0;else a=c[a+(c[42025]<<2)>>2...
function Gp (line 29) | function Gp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+80|0;f=e;g=...
function Hp (line 29) | function Hp(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=Gp(b,d,e)|0;if(!f...
function Ip (line 29) | function Ip(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;f=g;if...
function Jp (line 29) | function Jp(a){a=a|0;a=c[a+52>>2]|0;return Za[c[a>>2]&31](a,0,128)|0}
function Kp (line 29) | function Kp(a){a=a|0;var b=0;b=Lp(a)|0;if(!b)a=0;else{b=c[b+52>>2]|0;a=Z...
function Lp (line 29) | function Lp(a){a=a|0;return c[a+56>>2]|0}
function Mp (line 29) | function Mp(a,b){a=a|0;b=b|0;a=c[a+52>>2]|0;return Za[c[a>>2]&31](a,b,2)|0}
function Np (line 29) | function Np(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[42037]|0;e=(b|0)!=0;do ...
function Op (line 29) | function Op(a,b,d){a=a|0;b=b|0;d=d|0;a=c[42037]|0;if(!a)xN(b);else Zn(a,...
function Pp (line 29) | function Pp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=b+28|0;f=c[e>>2]|0;c[...
function Qp (line 29) | function Qp(a,b,d){a=a|0;b=b|0;d=d|0;c[42037]=a;return Za[c[b>>2]&31](b,...
function Rp (line 29) | function Rp(a,b){a=a|0;b=b|0;var d=0,e=0;d=(Ll(b,0,0)|0)+28|0;e=c[d>>2]|...
function Sp (line 29) | function Sp(a,b,c){a=a|0;b=b|0;c=c|0;if(c|0?(Ll(b,0,0)|0)!=(c|0):0)Ll(b,...
function Tp (line 29) | function Tp(a,b){a=a|0;b=b|0;if(!(dp(a)|0))b=Vp(a,b)|0;else Up(a,b)|0;re...
function Up (line 29) | function Up(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;a[c>>0]=60;f=c+1|0;while(1)...
function Vp (line 29) | function Vp(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0...
function Wp (line 29) | function Wp(a){a=a|0;return Tp(a,Xp(a)|0)|0}
function Xp (line 29) | function Xp(a){a=a|0;var b=0;b=((TK(a)|0)<<1)+2|0;b=b>>>0>1024?b:1024;a=...
function Yp (line 29) | function Yp(a,b){a=a|0;b=b|0;a=Jp(a)|0;while(1){if(!a){a=0;break}if((Zp(...
function Zp (line 29) | function Zp(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=Dn(b)|0;if((h|0)!=0?(...
function _p (line 29) | function _p(b,d){b=b|0;d=d|0;var e=0,f=0;c[42040]=0;e=Im(b,82298)|0;if((...
function $p (line 29) | function $p(a,b){a=a|0;b=b|0;var d=0;c[a>>2]=c[a>>2]&-9;d=Jp(a)|0;while(...
function aq (line 29) | function aq(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;if((e|0...
function bq (line 29) | function bq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:do if...
function cq (line 29) | function cq(a,b){a=a|0;b=b|0;c[42040]=(c[42040]|0)+-1;if((dq(a,b)|0)==-1...
function dq (line 29) | function dq(a,b){a=a|0;b=b|0;var d=0;d=c[42040]|0;while(1){if((d|0)<=0){...
function eq (line 29) | function eq(a,b,d){a=a|0;b=b|0;d=d|0;return lb[c[(c[(c[a+64>>2]|0)+8>>2]...
function fq (line 29) | function fq(a,b){a=a|0;b=b|0;a=Jp(a)|0;while(1){if(!a){a=0;break}if(!(Zp...
function gq (line 29) | function gq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if((Yp(a,b)|0)==0?(...
function hq (line 29) | function hq(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=ro(a)|0;do if((dq(d,b)|0)...
function iq (line 29) | function iq(a,b){a=a|0;b=b|0;a=Jp(a)|0;while(1){if(!a){a=1;break}if((Zp(...
function jq (line 29) | function jq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=c[a>>2]&3;g=c[((e...
function kq (line 29) | function kq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;i=l;l=l+32|...
function lq (line 29) | function lq(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;a:do if((d|0)!=0?(e=ro(...
function mq (line 29) | function mq(a){a=a|0;return (c[a>>2]|0)>>>3&1|0}
function nq (line 29) | function nq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:d...
function oq (line 29) | function oq(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;e=Dn(b)|0;b=ro(b)|0;if(...
function pq (line 29) | function pq(a,b,c){a=a|0;b=b|0;c=c|0;return qq(a,b,c,1)|0}
function qq (line 29) | function qq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(!d)c=Vp(c,Xp(c)|0)|0;els...
function rq (line 29) | function rq(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a:do if(0<e>>>0|(0==(e|0)?(...
function sq (line 29) | function sq(a,b){a=a|0;b=b|0;if(!(Sm(a,b)|0))a=(Pm(a,b)|0)==0;else a=0;r...
function t
Condensed preview — 221 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,340K chars).
[
{
"path": ".coveragerc",
"chars": 34,
"preview": "[run]\nbranch = True\nsource = silk\n"
},
{
"path": ".github/workflows/release.yml",
"chars": 995,
"preview": "name: Release\n\non:\n push:\n tags:\n - '*'\n\njobs:\n build:\n if: github.repository == 'jazzband/django-silk'\n r"
},
{
"path": ".github/workflows/test.yml",
"chars": 2948,
"preview": "name: Test\n\non: [push, pull_request]\n\njobs:\n build:\n name: build (Python ${{ matrix.python-version }}, Django ${{ ma"
},
{
"path": ".gitignore",
"chars": 1361,
"preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\n"
},
{
"path": ".pre-commit-config.yaml",
"chars": 1710,
"preview": "repos:\n- repo: https://github.com/pre-commit/pre-commit-hooks\n rev: 'v6.0.0'\n hooks:\n - id: check-merge-conflict\n- re"
},
{
"path": "CHANGELOG.md",
"chars": 60473,
"preview": "# Change Log\n## Unreleased\n\n## [5.5.0](https://github.com/jazzband/django-silk/tree/5.5.0) (2026-03-06)\n:release-by: Alb"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 2375,
"preview": "# Code of Conduct\n\nAs contributors and maintainers of the Jazzband projects, and in the interest of\nfostering an open an"
},
{
"path": "CONTRIBUTING.md",
"chars": 308,
"preview": "[](https://jazzband.co/)\n\nThis is a [Jazzband](https://jazzband."
},
{
"path": "LICENSE",
"chars": 1079,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2014 Michael Ford\n\nPermission is hereby granted, free of charge, to any person obta"
},
{
"path": "MANIFEST.in",
"chars": 277,
"preview": "include LICENSE\ninclude README*\nrecursive-include silk/templates *\nrecursive-include silk/static *\nrecursive-include sil"
},
{
"path": "README.md",
"chars": 18869,
"preview": "# Silk\n\n[](https://github.com/jazzban"
},
{
"path": "docs/Makefile",
"chars": 6752,
"preview": "# Makefile for Sphinx documentation\n\n# You can set these variables from the command line.\nSPHINXOPTS =\nSPHINXBUILD "
},
{
"path": "docs/conf.py",
"chars": 8205,
"preview": "#\n# silk documentation build configuration file, created by\n# sphinx-quickstart on Sun Jun 22 13:51:12 2014.\n#\n# This fi"
},
{
"path": "docs/configuration.rst",
"chars": 2183,
"preview": "Configuration\n=============\n\nAuthentication and Authorisation\n--------------------------------\n\nBy default anybody can a"
},
{
"path": "docs/index.rst",
"chars": 1203,
"preview": ".. silk documentation master file, created by\n sphinx-quickstart on Sun Jun 22 13:51:12 2014.\n You can adapt this fi"
},
{
"path": "docs/profiling.rst",
"chars": 2927,
"preview": "Profiling\n=========\n\nSilk can be used to profile arbitrary blocks of code and provides ``silk_profile``, a Python decora"
},
{
"path": "docs/quickstart.rst",
"chars": 1613,
"preview": "Quick Start\n===========\n\nSilk is installed like any other Django app.\n\nFirst install via pip:\n\n.. code-block:: bash\n\n\tpi"
},
{
"path": "docs/troubleshooting.rst",
"chars": 2375,
"preview": "Troubleshooting\n===============\n\nThe below details common problems when using Silk, most of which have been derived from"
},
{
"path": "gulpfile.js",
"chars": 329,
"preview": "let gulp = require('gulp'),\n sass = require('gulp-sass');\n\n\ngulp.task('watch', function () {\n gulp.watch('scss/**/"
},
{
"path": "package.json",
"chars": 633,
"preview": "{\n \"name\": \"silk\",\n \"version\": \"5.5.0\",\n \"description\": \"https://github.com/jazzband/django-silk\",\n \"main\": \"index.j"
},
{
"path": "project/example_app/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "project/example_app/admin.py",
"chars": 867,
"preview": "from django.contrib import admin\nfrom django.urls import reverse\n\nfrom .models import Blind\n\n\n@admin.register(Blind)\ncla"
},
{
"path": "project/example_app/migrations/0001_initial.py",
"chars": 680,
"preview": "# Generated by Django 1.9.7 on 2016-07-08 13:19\n\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.M"
},
{
"path": "project/example_app/migrations/0002_alter_blind_photo.py",
"chars": 383,
"preview": "# Generated by Django 3.2 on 2021-04-12 22:45\n\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.Mig"
},
{
"path": "project/example_app/migrations/0003_blind_unique_name_if_provided.py",
"chars": 461,
"preview": "# Generated by Django 3.2.16 on 2022-10-28 08:08\n\nfrom django.db import migrations, models\n\n\nclass Migration(migrations."
},
{
"path": "project/example_app/migrations/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "project/example_app/models.py",
"chars": 610,
"preview": "from django.db import models\n\n# Create your models here.\nfrom django.db.models import BooleanField, ImageField, TextFiel"
},
{
"path": "project/example_app/templates/example_app/blind_form.html",
"chars": 265,
"preview": "<html>\n<body>\n<h1>Example App</h1>\n<p>Use this app for testing and playing around with Silk. Displays a Blind creation f"
},
{
"path": "project/example_app/templates/example_app/index.html",
"chars": 635,
"preview": "<html>\n<head>\n<style>\n .blind {\n max-width: 200px\n }\n</style>\n</head>\n<body>\n<h1>Example App</h1>\n<p>Use th"
},
{
"path": "project/example_app/templates/example_app/login.html",
"chars": 690,
"preview": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n <meta charset=\"UTF-8\">\n <title></title>\n</head>\n<body>\n\n{% if form.errors"
},
{
"path": "project/example_app/tests.py",
"chars": 26,
"preview": "# Create your tests here.\n"
},
{
"path": "project/example_app/urls.py",
"chars": 227,
"preview": "from django.urls import path\n\nfrom . import views\n\napp_name = 'example_app'\nurlpatterns = [\n path(route='', view=view"
},
{
"path": "project/example_app/views.py",
"chars": 657,
"preview": "from time import sleep\n\n# Create your views here.\nfrom django.shortcuts import render\nfrom django.urls import reverse_la"
},
{
"path": "project/manage.py",
"chars": 297,
"preview": "#!/usr/bin/env python\n\"\"\"Define the Django Silk management entry.\"\"\"\nimport os\nimport sys\n\nif __name__ == \"__main__\":\n "
},
{
"path": "project/project/__init__.py",
"chars": 22,
"preview": "__author__ = 'mtford'\n"
},
{
"path": "project/project/settings.py",
"chars": 2986,
"preview": "import os\n\nBASE_DIR = os.path.dirname(os.path.dirname(__file__))\n\nSECRET_KEY = 'ey5!m&h-uj6c7dzp@(o1%96okkq4!&bjja%oi*v3"
},
{
"path": "project/project/urls.py",
"chars": 794,
"preview": "from django.conf import settings\nfrom django.conf.urls.static import static\nfrom django.contrib import admin\nfrom django"
},
{
"path": "project/tests/__init__.py",
"chars": 36,
"preview": "from . import * # noqa: F401, F403\n"
},
{
"path": "project/tests/data/__init__.py",
"chars": 22,
"preview": "__author__ = 'mtford'\n"
},
{
"path": "project/tests/data/dynamic.py",
"chars": 115,
"preview": "def foo():\n print('1')\n print('2')\n print('3')\n\n\ndef foo2():\n print('1')\n print('2')\n print('3')\n"
},
{
"path": "project/tests/factories.py",
"chars": 1147,
"preview": "import factory\nimport factory.fuzzy\nfrom example_app.models import Blind\n\nfrom silk.models import Request, Response, SQL"
},
{
"path": "project/tests/test_app_config.py",
"chars": 378,
"preview": "from django.apps import apps as proj_apps\nfrom django.test import TestCase\n\nfrom silk.apps import SilkAppConfig\n\n\nclass "
},
{
"path": "project/tests/test_code.py",
"chars": 2101,
"preview": "from collections import namedtuple\n\nfrom django.test import TestCase\n\nfrom silk.views.code import _code, _code_context, "
},
{
"path": "project/tests/test_code_gen_curl.py",
"chars": 620,
"preview": "import shlex\nfrom unittest import TestCase\n\nfrom silk.code_generation.curl import curl_cmd\n\n\nclass TestCodeGenCurl(TestC"
},
{
"path": "project/tests/test_code_gen_django.py",
"chars": 715,
"preview": "import textwrap\nfrom unittest import TestCase\n\nfrom silk.code_generation.django_test_client import gen\n\n\nclass TestCodeG"
},
{
"path": "project/tests/test_collector.py",
"chars": 3839,
"preview": "import cProfile\nimport os.path\nimport sys\n\nfrom django.test import TestCase\nfrom tests.util import DictStorage\n\nfrom sil"
},
{
"path": "project/tests/test_command_garbage_collect.py",
"chars": 845,
"preview": "from django.core import management\nfrom django.test import TestCase\n\nfrom silk import models\nfrom silk.config import Sil"
},
{
"path": "project/tests/test_compat.py",
"chars": 715,
"preview": "import json\nfrom unittest.mock import Mock\n\nfrom django.test import TestCase\n\nfrom silk.model_factory import ResponseMod"
},
{
"path": "project/tests/test_config_auth.py",
"chars": 2549,
"preview": "from django.contrib.auth.models import User\nfrom django.test import TestCase\nfrom django.urls import NoReverseMatch, rev"
},
{
"path": "project/tests/test_config_long_urls.py",
"chars": 1054,
"preview": "from unittest.mock import Mock\n\nfrom django.test import TestCase\n\nfrom silk.model_factory import RequestModelFactory\n\n\nc"
},
{
"path": "project/tests/test_config_max_body_size.py",
"chars": 2390,
"preview": "from unittest.mock import Mock\n\nfrom django.test import TestCase\nfrom django.urls import reverse\n\nfrom silk.collector im"
},
{
"path": "project/tests/test_config_meta.py",
"chars": 1502,
"preview": "from unittest.mock import NonCallableMock\n\nfrom django.test import TestCase\n\nfrom silk.collector import DataCollector\nfr"
},
{
"path": "project/tests/test_db.py",
"chars": 2166,
"preview": "\"\"\"\nTest profiling of DB queries without mocking, to catch possible\nincompatibility\n\"\"\"\nfrom django.shortcuts import rev"
},
{
"path": "project/tests/test_dynamic_profiling.py",
"chars": 3159,
"preview": "from unittest.mock import patch\n\nfrom django.test import TestCase\n\nimport silk\nfrom silk.profiling.dynamic import (\n "
},
{
"path": "project/tests/test_encoding.py",
"chars": 5627,
"preview": "import json\nfrom unittest.mock import Mock\n\nfrom django.test import TestCase\n\nfrom silk.model_factory import RequestMode"
},
{
"path": "project/tests/test_end_points.py",
"chars": 6944,
"preview": "import random\n\nfrom django.db.models import Count, F\nfrom django.test import TestCase\nfrom django.urls import reverse\n\nf"
},
{
"path": "project/tests/test_execute_sql.py",
"chars": 6548,
"preview": "from unittest.mock import Mock, NonCallableMagicMock, NonCallableMock, patch\n\nfrom django.test import TestCase\nfrom djan"
},
{
"path": "project/tests/test_filters.py",
"chars": 9088,
"preview": "import calendar\nimport random\nfrom datetime import datetime, timedelta, timezone\nfrom itertools import groupby\nfrom math"
},
{
"path": "project/tests/test_lib/__init__.py",
"chars": 22,
"preview": "__author__ = 'mtford'\n"
},
{
"path": "project/tests/test_lib/assertion.py",
"chars": 225,
"preview": "def dict_contains(child_dict, parent_dict):\n for key, value in child_dict.items():\n if key not in parent_dict:"
},
{
"path": "project/tests/test_lib/mock_suite.py",
"chars": 6429,
"preview": "import json\nimport os\nimport random\nimport traceback\nfrom datetime import timedelta\n\nfrom django.core import management\n"
},
{
"path": "project/tests/test_models.py",
"chars": 18387,
"preview": "import datetime\nimport uuid\n\nfrom django.core.management import call_command\nfrom django.test import TestCase, override_"
},
{
"path": "project/tests/test_multipart_forms.py",
"chars": 798,
"preview": "from unittest.mock import Mock\n\nfrom django.test import TestCase\nfrom django.urls import reverse\n\nfrom silk.model_factor"
},
{
"path": "project/tests/test_profile_dot.py",
"chars": 3150,
"preview": "# std\nimport cProfile\nimport os\nimport tempfile\nfrom contextlib import contextmanager\nfrom unittest.mock import MagicMoc"
},
{
"path": "project/tests/test_profile_parser.py",
"chars": 1849,
"preview": "import contextlib\nimport cProfile\nimport io\nimport re\n\nfrom django.test import TestCase\n\nfrom silk.utils.profile_parser "
},
{
"path": "project/tests/test_response_assumptions.py",
"chars": 421,
"preview": "from django.http import HttpResponse\nfrom django.test import TestCase\n\n\nclass TestResponseAssumptions(TestCase):\n\n de"
},
{
"path": "project/tests/test_sensitive_data_in_request.py",
"chars": 11108,
"preview": "import json\nfrom unittest.mock import Mock\n\nfrom django.test import TestCase\n\nfrom silk.config import SilkyConfig\nfrom s"
},
{
"path": "project/tests/test_silky_middleware.py",
"chars": 5206,
"preview": "from unittest.mock import patch\n\nfrom django.test import TestCase, override_settings\nfrom django.urls import reverse\n\nfr"
},
{
"path": "project/tests/test_silky_profiler.py",
"chars": 4435,
"preview": "from time import sleep\n\nfrom django.test import TestCase\n\nfrom silk.collector import DataCollector\nfrom silk.models impo"
},
{
"path": "project/tests/test_view_clear_db.py",
"chars": 1324,
"preview": "from django.test import TestCase\n\nfrom silk import models\nfrom silk.config import SilkyConfig\nfrom silk.middleware impor"
},
{
"path": "project/tests/test_view_profiling.py",
"chars": 5088,
"preview": "from unittest.mock import Mock\n\nfrom django.test import TestCase\n\nfrom silk.middleware import silky_reverse\nfrom silk.vi"
},
{
"path": "project/tests/test_view_requests.py",
"chars": 6737,
"preview": "import random\nimport unittest\nfrom unittest.mock import Mock\n\nfrom django.test import TestCase\n\nfrom silk.middleware imp"
},
{
"path": "project/tests/test_view_sql_detail.py",
"chars": 3889,
"preview": "import os\nimport random\nfrom unittest.mock import patch\n\nfrom django.conf import settings\nfrom django.test import TestCa"
},
{
"path": "project/tests/test_view_summary_view.py",
"chars": 1443,
"preview": "from django.test import TestCase\n\nfrom silk.middleware import silky_reverse\nfrom silk.views.summary import SummaryView\n\n"
},
{
"path": "project/tests/urlconf_without_silk.py",
"chars": 159,
"preview": "from django.urls import include, path\n\nurlpatterns = [\n path(\n 'example_app/',\n include('example_app.ur"
},
{
"path": "project/tests/util.py",
"chars": 1125,
"preview": "import io\nfrom unittest.mock import Mock\n\nfrom django.core.files import File\nfrom django.core.files.storage import Stora"
},
{
"path": "project/wsgi.py",
"chars": 401,
"preview": "\"\"\"WSGI config for django_silky project.\n\nIt exposes the WSGI callable as a module-level variable named ``application``."
},
{
"path": "pyproject.toml",
"chars": 58,
"preview": "[tool.autopep8]\nignore = \"E501,E203,W503\"\nin-place = true\n"
},
{
"path": "pytest.ini",
"chars": 219,
"preview": "[pytest]\naddopts = --cov silk --cov-config .coveragerc --cov-append --cov-report term --cov-report=xml\npython_files = te"
},
{
"path": "requirements.txt",
"chars": 154,
"preview": "coverage==7.13.0\nfactory-boy==3.3.3\nfreezegun==1.5.5\nnetworkx==3.4.2\npillow==12.1.1\npydot==3.0.4\npygments==2.20.0\npytest"
},
{
"path": "scss/components/cell.scss",
"chars": 570,
"preview": ".cell {\n display: inline-block;\n background-color: transparent;\n padding: 10px;\n margin-left: 10px;\n margin-top: 10"
},
{
"path": "scss/components/colors.scss",
"chars": 205,
"preview": ".very-good-font-color {\n color: #bac54b;\n}\n\n.good-font-color {\n color: #c3a948;\n}\n\n.ok-font-color {\n color: #c08245;\n"
},
{
"path": "scss/components/fonts.scss",
"chars": 1635,
"preview": "/**\n* Fira Sans\n*/\n\n@font-face {\n font-family: FiraSans;\n src: url(../../fonts/fira/FiraSans-Regular.woff);\n font-w"
},
{
"path": "scss/components/heading.scss",
"chars": 250,
"preview": ".heading {\n width: 100%;\n background-color: transparent;\n height: 30px;\n display: table;\n font-weight: bold;\n marg"
},
{
"path": "scss/components/numeric.scss",
"chars": 142,
"preview": ".numeric {\n font-weight: normal;\n}\n\n.unit {\n font-weight: normal;\n}\n\n.numeric .unit {\n font-size: 12px;\n}\n\n.numeric {"
},
{
"path": "scss/components/row.scss",
"chars": 1131,
"preview": ".row-wrapper {\n display: table;\n margin: 2rem;\n width: 100%;\n width: -moz-available;\n width: -webkit-fill-available"
},
{
"path": "scss/components/summary.scss",
"chars": 249,
"preview": "#error-div {\n margin: 10px;\n}\n\n#query-div {\n margin: auto;\n width: 960px;\n text-align: center;\n}\n\n#code {\n text-ali"
},
{
"path": "scss/pages/base.scss",
"chars": 1699,
"preview": "body {\n font-family: FiraSans, \"Helvetica Neue\", Arial, sans-serif;\n background-color: #f3f3f3;\n margin: 0;\n font-we"
},
{
"path": "scss/pages/clear_db.scss",
"chars": 566,
"preview": ".wrapper {\n width: 100%;\n margin-bottom: 20px;\n}\n\n.inner {\n margin: auto;\n width: 960px;\n}\n\n.cleardb-form .cleardb-f"
},
{
"path": "scss/pages/cprofile.scss",
"chars": 558,
"preview": "#query-info-div {\n margin-top: 15px;\n}\n\n#query-info-div .timestamp-div {\n font-size: 13px;\n\n}\n\n#pyprofile-div {\n disp"
},
{
"path": "scss/pages/detail_base.scss",
"chars": 349,
"preview": "#traceback {\n overflow: visible;\n}\n\n#time-div {\n text-align: center;\n margin-bottom: 30px;\n}\n\n#query-div {\n text-ali"
},
{
"path": "scss/pages/profile_detail.scss",
"chars": 558,
"preview": "#query-info-div {\n margin-top: 15px;\n}\n\n#query-info-div .timestamp-div {\n font-size: 13px;\n\n}\n\n#pyprofile-div {\n disp"
},
{
"path": "scss/pages/profiling.scss",
"chars": 176,
"preview": ".name-div {\n font-weight: bold;\n}\n\n.container {\n padding: 0 1em;\n}\n\n.description {\n\n}\n\nh2 {\n margin-bottom: 10px;\n}\n\n"
},
{
"path": "scss/pages/raw.scss",
"chars": 586,
"preview": "pre {\n width: 100%;\n height: 100%;\n margin: 0;\n padding: 0;\n background-color: white !important;\n white-space: pre"
},
{
"path": "scss/pages/request.scss",
"chars": 958,
"preview": "pre {\n white-space: pre-wrap; /* css-3 */\n white-space: -moz-pre-wrap; /* Mozilla, since 1999 */\n /*noinspection CssI"
},
{
"path": "scss/pages/requests.scss",
"chars": 271,
"preview": ".container {\n padding: 0 1em;\n}\n\n.resizing-input input {\n background-color: white;\n padding-top: 2px;\n color: black;"
},
{
"path": "scss/pages/root_base.scss",
"chars": 3814,
"preview": ".cell:hover {\n background-color: rgb(51, 51, 68);\n color: white;\n cursor: pointer;\n}\n\n.cell {\n text-align: center;\n}"
},
{
"path": "scss/pages/sql.scss",
"chars": 604,
"preview": ".right-aligned {\n text-align: right;\n\n}\n\n.center-aligned {\n text-align: center;\n\n}\n\n.left-aligned {\n text-align: left"
},
{
"path": "scss/pages/sql_detail.scss",
"chars": 733,
"preview": "#traceback {\n width: 960px;\n margin: auto;\n}\n\n#traceback pre {\n margin-top: 15px !important;\n margin-bottom: 15px !i"
},
{
"path": "scss/pages/summary.scss",
"chars": 597,
"preview": ".wrapper {\n width: 100%;\n margin-bottom: 20px;\n}\n\n.inner {\n margin: auto;\n width: 960px;\n}\n\n.summary-cell {\n displa"
},
{
"path": "setup.py",
"chars": 1608,
"preview": "import os\n\nfrom setuptools import setup\n\n# allow setup.py to be run from any path\nos.chdir(os.path.normpath(os.path.join"
},
{
"path": "silk/__init__.py",
"chars": 77,
"preview": "from importlib.metadata import version\n\n__version__ = version(\"django-silk\")\n"
},
{
"path": "silk/apps.py",
"chars": 140,
"preview": "from django.apps import AppConfig\n\n\nclass SilkAppConfig(AppConfig):\n default_auto_field = \"django.db.models.AutoField"
},
{
"path": "silk/auth.py",
"chars": 1060,
"preview": "from functools import WRAPPER_ASSIGNMENTS, wraps\n\nfrom django.contrib.auth.decorators import login_required\nfrom django."
},
{
"path": "silk/code_generation/__init__.py",
"chars": 22,
"preview": "__author__ = 'mtford'\n"
},
{
"path": "silk/code_generation/curl.py",
"chars": 2219,
"preview": "import json\nfrom urllib.parse import urlencode\n\nfrom django.template import Context, Template\n\ncurl_template = \"\"\"\\\ncurl"
},
{
"path": "silk/code_generation/django_test_client.py",
"chars": 1805,
"preview": "from urllib.parse import urlencode\n\ntry:\n import autopep8\nexcept ImportError:\n autopep8 = None\nfrom django.templat"
},
{
"path": "silk/collector.py",
"chars": 8438,
"preview": "import cProfile\nimport logging\nimport marshal\nimport pstats\nimport re\nimport unicodedata\nfrom io import StringIO\nfrom th"
},
{
"path": "silk/config.py",
"chars": 1886,
"preview": "from copy import copy\n\nfrom silk.singleton import Singleton\n\n\ndef default_permissions(user):\n if user:\n return"
},
{
"path": "silk/errors.py",
"chars": 139,
"preview": "class SilkError(Exception):\n pass\n\n\nclass SilkNotConfigured(SilkError):\n pass\n\n\nclass SilkInternalInconsistency(Si"
},
{
"path": "silk/management/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "silk/management/commands/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "silk/management/commands/silk_clear_request_log.py",
"chars": 530,
"preview": "from django.core.management.base import BaseCommand\n\nimport silk.models\nfrom silk.utils.data_deletion import delete_mode"
},
{
"path": "silk/management/commands/silk_request_garbage_collect.py",
"chars": 1031,
"preview": "from django.core.management.base import BaseCommand\n\nimport silk.models\nfrom silk.config import SilkyConfig\n\n\nclass Comm"
},
{
"path": "silk/middleware.py",
"chars": 7232,
"preview": "import logging\nimport random\n\nfrom django.conf import settings\nfrom django.db import DatabaseError, router, transaction\n"
},
{
"path": "silk/migrations/0001_initial.py",
"chars": 4414,
"preview": "import uuid\n\nimport django.utils.timezone\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.Migratio"
},
{
"path": "silk/migrations/0002_auto_update_uuid4_id_field.py",
"chars": 594,
"preview": "import uuid\n\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n\n dependencies = [\n "
},
{
"path": "silk/migrations/0003_request_prof_file.py",
"chars": 403,
"preview": "# Generated by Django 1.9.7 on 2016-07-08 18:23\n\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.M"
},
{
"path": "silk/migrations/0004_request_prof_file_storage.py",
"chars": 451,
"preview": "# Generated by Django 1.10.4 on 2016-12-06 00:23\n\nfrom django.db import migrations, models\n\nimport silk.models\n\n\nclass M"
},
{
"path": "silk/migrations/0005_increase_request_prof_file_length.py",
"chars": 475,
"preview": "# Generated by Django 1.11.3 on 2017-07-31 23:40\n\nfrom django.db import migrations, models\n\nimport silk.models\n\n\nclass M"
},
{
"path": "silk/migrations/0006_fix_request_prof_file_blank.py",
"chars": 494,
"preview": "# Generated by Django 2.0 on 2017-12-28 14:21\n\nfrom django.db import migrations, models\n\nimport silk.storage\n\n\nclass Mig"
},
{
"path": "silk/migrations/0007_sqlquery_identifier.py",
"chars": 396,
"preview": "# Generated by Django 2.2.6 on 2019-10-26 12:57\n\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.M"
},
{
"path": "silk/migrations/0008_sqlquery_analysis.py",
"chars": 395,
"preview": "# Generated by Django 2.2.17 on 2020-11-26 13:17\n\nfrom django.db import migrations, models\n\n\nclass Migration(migrations."
},
{
"path": "silk/migrations/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "silk/model_factory.py",
"chars": 12413,
"preview": "import base64\nimport json\nimport logging\nimport re\nimport sys\nimport traceback\nfrom uuid import UUID\n\nfrom django.core.e"
},
{
"path": "silk/models.py",
"chars": 12995,
"preview": "import base64\nimport json\nimport random\nimport re\nfrom uuid import uuid4\n\nimport sqlparse\nfrom django.conf import settin"
},
{
"path": "silk/profiling/__init__.py",
"chars": 22,
"preview": "__author__ = 'mtford'\n"
},
{
"path": "silk/profiling/dynamic.py",
"chars": 6698,
"preview": "import inspect\nimport logging\nimport re\nimport sys\n\nfrom silk.profiling.profiler import silk_profile\n\nLogger = logging.g"
},
{
"path": "silk/profiling/profiler.py",
"chars": 6928,
"preview": "import inspect\nimport logging\nimport time\nimport traceback\nfrom functools import wraps\n\nfrom django.apps import apps\nfro"
},
{
"path": "silk/request_filters.py",
"chars": 6623,
"preview": "\"\"\"\nDjango queryset filters used by the requests view\n\"\"\"\nimport logging\nfrom datetime import datetime, timedelta\n\nfrom "
},
{
"path": "silk/singleton.py",
"chars": 316,
"preview": "__author__ = 'mtford'\n\n\nclass Singleton(type, metaclass=object):\n def __init__(cls, name, bases, d):\n super()."
},
{
"path": "silk/sql.py",
"chars": 3879,
"preview": "import logging\nimport traceback\n\nfrom django.core.exceptions import EmptyResultSet\nfrom django.utils import timezone\nfro"
},
{
"path": "silk/static/silk/css/components/cell.css",
"chars": 557,
"preview": ".cell {\n display: inline-block;\n background-color: transparent;\n padding: 10px;\n margin-left: 10px;\n margin-top: 10"
},
{
"path": "silk/static/silk/css/components/colors.css",
"chars": 205,
"preview": ".very-good-font-color {\n color: #bac54b;\n}\n\n.good-font-color {\n color: #c3a948;\n}\n\n.ok-font-color {\n color: #c08245;\n"
},
{
"path": "silk/static/silk/css/components/fonts.css",
"chars": 1622,
"preview": "/**\n* Fira Sans\n*/\n@font-face {\n font-family: FiraSans;\n src: url(../../fonts/fira/FiraSans-Regular.woff);\n font-we"
},
{
"path": "silk/static/silk/css/components/heading.css",
"chars": 247,
"preview": ".heading {\n width: 100%;\n background-color: transparent;\n height: 30px;\n display: table;\n font-weight: bold;\n marg"
},
{
"path": "silk/static/silk/css/components/numeric.css",
"chars": 142,
"preview": ".numeric {\n font-weight: normal;\n}\n\n.unit {\n font-weight: normal;\n}\n\n.numeric .unit {\n font-size: 12px;\n}\n\n.numeric {"
},
{
"path": "silk/static/silk/css/components/row.css",
"chars": 1135,
"preview": ".row-wrapper {\n display: table;\n margin: 2rem;\n width: 100%;\n width: -moz-available;\n width: -webkit-fill-available"
},
{
"path": "silk/static/silk/css/components/summary.css",
"chars": 249,
"preview": "#error-div {\n margin: 10px;\n}\n\n#query-div {\n margin: auto;\n width: 960px;\n text-align: center;\n}\n\n#code {\n text-ali"
},
{
"path": "silk/static/silk/css/pages/base.css",
"chars": 1693,
"preview": "body {\n font-family: FiraSans, \"Helvetica Neue\", Arial, sans-serif;\n background-color: #f3f3f3;\n margin: 0;\n font-we"
},
{
"path": "silk/static/silk/css/pages/clear_db.css",
"chars": 569,
"preview": ".wrapper {\n width: 100%;\n margin-bottom: 20px;\n}\n\n.inner {\n margin: auto;\n width: 960px;\n}\n\n.cleardb-form .cleardb-f"
},
{
"path": "silk/static/silk/css/pages/cprofile.css",
"chars": 557,
"preview": "#query-info-div {\n margin-top: 15px;\n}\n\n#query-info-div .timestamp-div {\n font-size: 13px;\n}\n\n#pyprofile-div {\n displ"
},
{
"path": "silk/static/silk/css/pages/detail_base.css",
"chars": 349,
"preview": "#traceback {\n overflow: visible;\n}\n\n#time-div {\n text-align: center;\n margin-bottom: 30px;\n}\n\n#query-div {\n text-ali"
},
{
"path": "silk/static/silk/css/pages/profile_detail.css",
"chars": 557,
"preview": "#query-info-div {\n margin-top: 15px;\n}\n\n#query-info-div .timestamp-div {\n font-size: 13px;\n}\n\n#pyprofile-div {\n displ"
},
{
"path": "silk/static/silk/css/pages/profiling.css",
"chars": 157,
"preview": ".name-div {\n font-weight: bold;\n}\n\n.container {\n padding: 0 1em;\n}\n\nh2 {\n margin-bottom: 10px;\n}\n\n.pyprofile {\n over"
},
{
"path": "silk/static/silk/css/pages/raw.css",
"chars": 587,
"preview": "pre {\n width: 100%;\n height: 100%;\n margin: 0;\n padding: 0;\n background-color: white !important;\n white-space: pre"
},
{
"path": "silk/static/silk/css/pages/request.css",
"chars": 913,
"preview": "pre {\n white-space: pre-wrap; /* css-3 */\n white-space: -moz-pre-wrap; /* Mozilla, since 1999 */\n /*noinspection CssI"
},
{
"path": "silk/static/silk/css/pages/requests.css",
"chars": 271,
"preview": ".container {\n padding: 0 1em;\n}\n\n.resizing-input input {\n background-color: white;\n padding-top: 2px;\n color: black;"
},
{
"path": "silk/static/silk/css/pages/root_base.css",
"chars": 3749,
"preview": ".cell:hover {\n background-color: rgb(51, 51, 68);\n color: white;\n cursor: pointer;\n}\n\n.cell {\n text-align: center;\n}"
},
{
"path": "silk/static/silk/css/pages/sql.css",
"chars": 602,
"preview": ".right-aligned {\n text-align: right;\n}\n\n.center-aligned {\n text-align: center;\n}\n\n.left-aligned {\n text-align: left;\n"
},
{
"path": "silk/static/silk/css/pages/sql_detail.css",
"chars": 733,
"preview": "#traceback {\n width: 960px;\n margin: auto;\n}\n\n#traceback pre {\n margin-top: 15px !important;\n margin-bottom: 15px !i"
},
{
"path": "silk/static/silk/css/pages/summary.css",
"chars": 596,
"preview": ".wrapper {\n width: 100%;\n margin-bottom: 20px;\n}\n\n.inner {\n margin: auto;\n width: 960px;\n}\n\n.summary-cell {\n displa"
},
{
"path": "silk/static/silk/js/components/cell.js",
"chars": 731,
"preview": "function configureSpanFontColors(selector, okValue, badValue) {\n selector.each(function () {\n var val = parseF"
},
{
"path": "silk/static/silk/js/components/filters.js",
"chars": 1309,
"preview": "\nfunction configureResizingInputs() {\n var $inputs = $('.resizing-input');\n\n function resizeForText(text) {\n "
},
{
"path": "silk/static/silk/js/pages/base.js",
"chars": 265,
"preview": "$(document).ready(function () {\n configureSpanFontColors($('#num-joins-div').find('.numeric'), 3, 5);\n configureSp"
},
{
"path": "silk/static/silk/js/pages/clear_db.js",
"chars": 174,
"preview": "$(document).ready(function () {\n initFilters();\n var $inputs = $('.resizing-input');\n $inputs.focusout(function"
},
{
"path": "silk/static/silk/js/pages/detail_base.js",
"chars": 31,
"preview": "hljs.initHighlightingOnLoad();\n"
},
{
"path": "silk/static/silk/js/pages/profile_detail.js",
"chars": 468,
"preview": "function createViz() {\n var profileDotURL = JSON.parse(document.getElementById(\"profileDotURL\").textContent);\n\n $."
},
{
"path": "silk/static/silk/js/pages/profiling.js",
"chars": 79,
"preview": "$(document).ready(function () {\n initFilters();\n initFilterButton();\n});\n"
},
{
"path": "silk/static/silk/js/pages/raw.js",
"chars": 31,
"preview": "hljs.initHighlightingOnLoad();\n"
},
{
"path": "silk/static/silk/js/pages/request.js",
"chars": 31,
"preview": "hljs.initHighlightingOnLoad();\n"
},
{
"path": "silk/static/silk/js/pages/requests.js",
"chars": 79,
"preview": "$(document).ready(function () {\n initFilters();\n initFilterButton();\n});\n"
},
{
"path": "silk/static/silk/js/pages/root_base.js",
"chars": 439,
"preview": "function initFilterButton() {\n $('#filter-button').click(function () {\n $(this).toggleClass('active');\n "
},
{
"path": "silk/static/silk/js/pages/sql.js",
"chars": 438,
"preview": "$(document).ready(function () {\n document.querySelectorAll(\".data-row\").forEach((rowElement) => {\n let sqlDetailUrl "
},
{
"path": "silk/static/silk/js/pages/sql_detail.js",
"chars": 187,
"preview": "$(document).ready(function () {\n configureSpanFontColors($('#num-joins-div').find('.numeric'), 3, 5);\n configureSp"
},
{
"path": "silk/static/silk/js/pages/summary.js",
"chars": 174,
"preview": "$(document).ready(function () {\n initFilters();\n var $inputs = $('.resizing-input');\n $inputs.focusout(function"
},
{
"path": "silk/static/silk/lib/highlight/foundation.css",
"chars": 1582,
"preview": "/*\nDescription: Foundation 4 docs style for highlight.js\nAuthor: Dan Allen <dan.j.allen@gmail.com>\nWebsite: http://found"
},
{
"path": "silk/static/silk/lib/highlight/highlight.pack.js",
"chars": 10481,
"preview": "var hljs=new function(){function k(v){return v.replace(/&/gm,\"&\").replace(/</gm,\"<\").replace(/>/gm,\">\")}functi"
},
{
"path": "silk/static/silk/lib/jquery.datetimepicker.css",
"chars": 17870,
"preview": ".xdsoft_datetimepicker {\n\tbox-shadow: 0 5px 15px -5px rgba(0, 0, 0, 0.506);\n\tbackground: #fff;\n\tborder-bottom: 1px solid"
},
{
"path": "silk/static/silk/lib/jquery.datetimepicker.js",
"chars": 76598,
"preview": "/**\n * @preserve jQuery DateTimePicker plugin v2.4.3\n * @homepage http://xdsoft.net/jqplugins/datetimepicker/\n * (c) 201"
},
{
"path": "silk/static/silk/lib/sortable.js",
"chars": 16893,
"preview": "/*\n SortTable\n version 2\n 7th April 2007\n Stuart Langridge, http://www.kryogenix.org/code/browser/sorttable/\n\n Inst"
},
{
"path": "silk/static/silk/lib/viz-lite.js",
"chars": 1693864,
"preview": "/*\nViz.js 1.7.1 (Graphviz 2.40.1, Emscripten 1.37.9)\nCopyright (c) 2014-2017 Michael Daines\nLicensed under MIT license\n\n"
},
{
"path": "silk/storage.py",
"chars": 413,
"preview": "from django.core.files.storage import FileSystemStorage\n\nfrom silk.config import SilkyConfig\n\n\nclass ProfilerResultStora"
},
{
"path": "silk/templates/silk/base/base.html",
"chars": 1490,
"preview": "{% load static %}\n<!DOCTYPE html>\n<html>\n<head>\n <title>{% block pagetitle %}Silky{% endblock %}</title>\n <link re"
},
{
"path": "silk/templates/silk/base/detail_base.html",
"chars": 869,
"preview": "{% extends 'silk/base/base.html' %}\n{% load static %}\n{% block style %}\n <link rel=\"stylesheet\" href=\"{% static 'silk"
},
{
"path": "silk/templates/silk/base/root_base.html",
"chars": 2138,
"preview": "{% extends \"silk/base/base.html\" %}\n{% load silk_nav %}\n{% load silk_inclusion %}\n{% load static %}\n\n{% block body_class"
},
{
"path": "silk/templates/silk/clear_db.html",
"chars": 1514,
"preview": "{% extends 'silk/base/root_base.html' %}\n{% load silk_inclusion %}\n{% load static %}\n{% block pagetitle %}Silky - Clear "
},
{
"path": "silk/templates/silk/cprofile.html",
"chars": 1518,
"preview": "{% extends \"silk/base/detail_base.html\" %}\n{% load silk_filters %}\n{% load silk_nav %}\n{% load silk_inclusion %}\n{% load"
},
{
"path": "silk/templates/silk/inclusion/code.html",
"chars": 160,
"preview": "<pre><code>...\n{% for line in code %}<span class=\"line {% if line.strip in actual_line %}the-line{% endif %}\">{{ line }}"
},
{
"path": "silk/templates/silk/inclusion/heading.html",
"chars": 91,
"preview": "<div class=\"heading\">\n <div class=\"inner-heading\">\n {{ text }}\n </div>\n</div>\n"
},
{
"path": "silk/templates/silk/inclusion/profile_menu.html",
"chars": 1650,
"preview": "{% load silk_nav %}\n<a href=\"\n {% if silk_request %}\n {% url \"silk:request_profiling\" silk_request.id %}\n {"
},
{
"path": "silk/templates/silk/inclusion/profile_summary.html",
"chars": 885,
"preview": "{% load silk_filters %}\n<div class=\"cell\">\n <div class=\"timestamp-div\">{{ profile.start_time | silk_date_time }}</div"
},
{
"path": "silk/templates/silk/inclusion/request_menu.html",
"chars": 1400,
"preview": "{% load silk_nav %}\n<a href=\"\n\n {% url \"silk:requests\" %}\n\">\n <div class=\"menu-item selectable-menu-item\">\n "
},
{
"path": "silk/templates/silk/inclusion/request_summary.html",
"chars": 1377,
"preview": "{% load silk_filters %}\n<div class=\"cell\">\n <div class=\"timestamp-div\">{{ silk_request.start_time | silk_date_time }}"
},
{
"path": "silk/templates/silk/inclusion/request_summary_row.html",
"chars": 1403,
"preview": "{% load silk_filters %}\n <div class=\"col timestamp-div\">{{ silk_request.start_time | silk_date_time }}</div>\n <div"
},
{
"path": "silk/templates/silk/inclusion/root_menu.html",
"chars": 1022,
"preview": "{% load silk_nav %}\n<div class=\"menu-item selectable-menu-item {% navactive request 'silk:summary' %}\">\n <a href=\"{% "
},
{
"path": "silk/templates/silk/profile_detail.html",
"chars": 3732,
"preview": "{% extends \"silk/base/detail_base.html\" %}\n{% load silk_filters %}\n{% load silk_nav %}\n{% load silk_inclusion %}\n{% load"
},
{
"path": "silk/templates/silk/profiling.html",
"chars": 8327,
"preview": "{% extends 'silk/base/root_base.html' %}\n{% load static %}\n{% load silk_inclusion %}\n\n{% block pagetitle %}Silky - Profi"
},
{
"path": "silk/templates/silk/raw.html",
"chars": 485,
"preview": "{% load static %}\n<html>\n<head>\n <link rel=\"stylesheet\" href=\"{% static 'silk/css/components/fonts.css' %}\"/>\n <li"
},
{
"path": "silk/templates/silk/request.html",
"chars": 5903,
"preview": "{% extends \"silk/base/base.html\" %}\n{% load silk_filters %}\n{% load silk_inclusion %}\n{% load static %}\n{% block pagetit"
},
{
"path": "silk/templates/silk/requests.html",
"chars": 10458,
"preview": "{% extends 'silk/base/root_base.html' %}\n{% load silk_inclusion %}\n{% load static %}\n\n{% block pagetitle %}Silky - Reque"
},
{
"path": "silk/templates/silk/sql.html",
"chars": 4313,
"preview": "{% extends 'silk/base/base.html' %}\n\n{% load silk_nav %}\n{% load silk_filters %}\n{% load static %}\n{% load silk_inclusio"
},
{
"path": "silk/templates/silk/sql_detail.html",
"chars": 3045,
"preview": "{% extends \"silk/base/detail_base.html\" %}\n{% load static %}\n{% load silk_filters %}\n{% load silk_nav %}\n{% load silk_in"
},
{
"path": "silk/templates/silk/summary.html",
"chars": 6506,
"preview": "{% extends 'silk/base/root_base.html' %}\n{% load silk_inclusion %}\n{% load static %}\n{% block menu %}\n {% root_menu r"
},
{
"path": "silk/templatetags/__init__.py",
"chars": 22,
"preview": "__author__ = 'mtford'\n"
},
{
"path": "silk/templatetags/silk_filters.py",
"chars": 2122,
"preview": "import re\n\nfrom django.template import Library\nfrom django.template.defaultfilters import stringfilter\nfrom django.utils"
},
{
"path": "silk/templatetags/silk_inclusion.py",
"chars": 1393,
"preview": "from django.template import Library\n\nregister = Library()\n\n\ndef request_summary(silk_request):\n return {'silk_request"
},
{
"path": "silk/templatetags/silk_nav.py",
"chars": 399,
"preview": "from django import template\nfrom django.urls import reverse\n\nregister = template.Library()\n\n\n@register.simple_tag\ndef na"
},
{
"path": "silk/templatetags/silk_urls.py",
"chars": 559,
"preview": "from django.template import Library\nfrom django.urls import reverse\n\nregister = Library()\n\n\n@register.simple_tag\ndef sql"
},
{
"path": "silk/urls.py",
"chars": 2929,
"preview": "from django.urls import path\n\nfrom silk.views.clear_db import ClearDBView\nfrom silk.views.cprofile import CProfileView\nf"
}
]
// ... and 21 more files (download for full content)
About this extraction
This page contains the full source code of the django-silk/silk GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 221 files (2.2 MB), approximately 582.7k tokens, and a symbol index with 2961 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.